• 大小: 3KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-06-02
  • 语言: Python
  • 标签: python  

资源简介

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\link_crawler.py

     文件       1162  2018-11-09 20:23  weather_reptile\scrape_callback.py

     目录          0  2018-11-11 19:44  weather_reptile

----------- ---------  ---------- -----  ----

                 6495                    3


评论

共有 条评论