资源简介
python3实现爬取中国天气网天气并写入csv,若有疑问可参照对应博客或询问
代码片段和文件信息
import re
from urllib.parse import urlparseurljoinurlsplit
import urllib.request
import time
from datetime import datetime
import urllib.robotparser
import queue
def link_crawler(seed_url link_regex=None delay=5 max_depth=-1 max_urls=-1 headers=None user_agent=‘wswp‘ proxy=None num_retries=1 scrape_callback=None):
“““
在link_regex匹配的链接之后从给定的种子URL抓取
“““
# 仍需要抓取的URL队列
crawl_queue = [seed_url]
# 已经看到深度的URL
seen = {seed_url: 0}
# 追踪有多少URL被下载过
num_urls = 0
rp = get_robots(seed_url)
throttle = Throttle(delay)
headers = headers or {}
if user_agent:
headers[‘User-agent‘] = user_agent
while crawl_queue:
url = crawl_queue.pop()
depth = seen[url]
# 检查url传递的robots.txt限制
if rp.can_fetch(user_agent url):
throttle.wait(url)
html = download(url headers proxy=proxy num_retries=num_retries)
links = []
if scrape_callback:
links.extend(scrape_callback(url html) or [])
#未达到最大深度,仍可以进一步爬取
if depth != max_depth:
if link_regex:
# 筛选符合正则表达式的链接
links.extend(link for link in get_links(html) if re.match(link_regex link))
for link in links:
link = normalize(seed_url link)
# 检查是否已抓取此链接
if link not in seen:
seen[link] = depth + 1
# 检查链接是否在同一个域内
if same_domain(seed_url link):
# 成功! 将此新链接添加到队列
crawl_queue.append(link)
# 检查是否已达到下载的最大值
num_urls += 1
if num_urls == max_urls:
break
else:
print (‘Blocked by robots.txt:‘ url)
#节流
class Throttle:
“““
通过在对同一域之间请求休眠来限制下载
“““
def __init__(self delay):
#每个域的下载之间的延迟量
self.delay = delay
# 上次访问域时的时间戳
self.domains = {}
def wait(self url):
“““
如果最近访问过这个域,则会延迟
“““
domain = urlsplit(url).netloc
last_accessed = self.domains.get(domain)
if self.delay > 0 and last_accessed is not None:
sleep_secs = self.delay - (datetime.now() - last_accessed).seconds
if sleep_secs > 0:
time.sleep(sleep_secs)
self.domains[domain] = datetime.now()
#下载网址
def download(url headers proxy num_retries data=None):
print (‘Downloading:‘ url)
request = urllib.request.Request(url data headers)
opener = urllib.request.build_opener()
if proxy:
proxy_params = {urlparse.urlparse(url).scheme: proxy}
opener.add_handler(urllib.request.ProxyHandler(proxy_params))
try:
response = opener.open(request)
html = response.read()
code = response.code
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 5333 2018-11-09 20:23 weather_reptile\li
文件 1162 2018-11-09 20:23 weather_reptile\scrape_callback.py
目录 0 2018-11-11 19:44 weather_reptile
----------- --------- ---------- ----- ----
6495 3
- 上一篇:nulindai.py
- 下一篇:超限学习机—逻辑回归Python代码
相关资源
- 超限学习机—逻辑回归Python代码
- Python2.7 贪吃蛇小游戏源码
- python实现logistics的分叉图
- 对任意关键字爬虫对应图片代码
- 图虫网爬虫python实现
- 网站图片爬取代码
- SIFT算法特征提取的python实现
- 已知两点经纬度坐标,求距离函数
- 最新Python3.6网络爬虫实战案例5章(基
- 一个简单的全覆盖路径规划python
- 徐州地区及周边范围noaa气象数据数据
- python五子棋代码
- 社区发现算法 加权GN算法的Python实现
- 基于用户协同过滤usercf的python代码实
- 21天学通python.txt
- python实现视频直播
- python QQ第三方登陆
- tensorflow2.0实现mnist手写数字识别代码
- Python源码剖析_代码(pythonympx.rar)
- 豆瓣爬虫python
- 计算机视觉视频教程百度云盘资源
- Shapely-1.6.4.post1-cp36-cp36m-win_amd64.whl
- python 战棋游戏六边形地图代码实现
- naive bayes代码实现(python版)
- springcloudpython
- MODIS_Mosaic.py
- 经典动量与反转交易策略python版
- Python习题集含答案
- Python实现一个简单的3层BP神经网络
- python-urx-master.zip
评论
共有 条评论