python写爬虫1-写一个简单爬虫

python写爬虫1-写一个简单爬虫

本文用urllib2模块编写一个简单的爬虫

1.背景调研

写爬虫之前,要先调研一下你要爬取的站点信息,比如网站类型、后端语言、服务器类型、网站所有者等等

检查网站构建的技术类型—builtwith模块

安装方法如下:
pip install builtwith

使用方法如下:
这里写图片描述
从上图中可知,该站点使用ruby写的后端,后端框架用的是rails,前端框架用的是twitter boootstrap。

寻找网站所有者
可以用站长工具查询,也可以借助python的python-whois库

安装方法如下:
pip install python-whois

使用方法如下:
这里写图片描述

2.编写爬虫

2.1重试下载

下载过程中,遇到的错误经常是临时性的,比如服务器过载时返回的503 Service Unavailbale错误。对于类似错误,我们可以尝试重新下载。如果是404 Not Found这种错误,说明此网页不存在,无需重试。

#! /usr/bin/env python

import urllib2

def download(url, num_retries=2):  # 重试下载次数 -> num_retries
    print 'Downloading:', url
    try:
        html = urllib2.urlopen(url).read()
    except urllib2.URLError as e:
        print 'Downloading error:', e.reason
        html = None
        if num_retries > 0:
            if hasattr(e, 'code') and 500 <= e.code < 600:  # 只有报服务器错误时,重试下载
                return download(url, num_retries-1)
    return html

2.2设置用户代理

urllib2的默认用户代理是Python-urllib/2.7,有些网站对此默认代理的访问请求是拒绝的。所以,我们最好自己设置一下代理。

#! /usr/bin/env python

import urllib2

def download(url, user_agent='wswp', num_retries=2):
    print 'Downloading:', url
    headers = {'User-agent': user_agent}
    request = urllib2.Request(url, headers=headers)
    try:
        html = urllib2.urlopen(request).read()
    except urllib2.URLError as e:
        print 'Downloading error:', e.reason
        html = None
        if num_retries > 0:
            if hasattr(e, 'code') and 500 <= e.code < 600:  # 只有报服务器错误时,重试下载
                return download(url, num_retries-1)
    return html

2.3链接下载

通过页面上的链接,跟踪链接,访问并下载内容。

import re

def link_crawler(seed_url, link_regex):
    crawl_queue = [seed_url]
    while crawl_queue:
        url = crawl_queue.pop()
        html = download(url)
        for link in get_links(html):
            if re.match(link_regex, link):
                crawl_queue.append(link)

def get_links(html):
    webpage_regex = re.compile('<a[^>]+href=["\'](.*?)["\']', re.IGNORECASE)
    return webpage_regex.findall(html)

有时,我们获取到的链接是一个相对链接,这时,我们需要将相对链接转为绝对链接,python中有用来实现这一功能的模块—urlparse;另外,为避免重复爬取相同的链接,我们需要记录哪些链接已被爬取过。

import urlparse

def link_crawler(seed_url, link_regex):
    crawl_queue = [seed_url]
    while crawl_queue:
        url = crawl_queue.pop()
        html = download(url)
        for link in get_links(html):
            if re.match(link_regex, link):
                link = urlparse.urljoin(seed_url, link)
                if link not in seen:
                    seen.add(link)
                    crawl_queue.append(link)

2.4加载robots.txt

我们需要解析robots.txt文件,以避免下载禁止爬取的url。使用python自带的robotparser模块实现。
这里写图片描述
为了将该功能集成到爬虫中,我们需要在crawl循环中添加该检查

...
while crawl_queue:
    url = crawl_queue.pop()
    if rp.can_fetch(user_agent, url):
        ...
    else:
        print 'Blocked by robots.txt:', url

另外需要注意下载限速、爬虫陷阱等问题

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值