python写爬虫1-写一个简单爬虫
来源:互联网 发布:java instanceof方法 编辑:程序博客网 时间:2024/05/16 01:07
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 pythonimport urllib2def 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 pythonimport urllib2def 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 redef 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 urlparsedef 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
另外需要注意下载限速、爬虫陷阱等问题
- python写爬虫1-写一个简单爬虫
- 用Python写一个简单的爬虫
- 【爬虫】十分钟写一个简单爬虫
- 用Python写简单爬虫
- python写一个爬虫(1)
- 用python写一个简单的爬虫功能
- 用Python写一个简单的爬虫功能
- 用python写一个简单的爬虫功能
- 用Python写一个简单的微博爬虫
- python简单速成,一行代码写爬虫
- scrapy1.3.2 写一个简单爬虫
- scrapy初探:写一个简单的爬虫
- Python写的一个爬虫程序
- python写一个爬虫(2)
- python写一个爬虫(3)
- python写一个爬虫(4)改进
- 如何使用Python写一个爬虫软件
- 用python写一个美女图片爬虫
- alter session set cursor_sharing=Exact;
- 20170208大量Http请求close_wait的问题
- Eclipse 安装插件
- C++幼儿园[4] - 指针
- Ruby on Rails学习笔记(2)--修改根页面
- python写爬虫1-写一个简单爬虫
- PHP生成txt文件标题及内容
- ajax跨域问题
- 大多PHP开发人员会犯错的运算
- Hello 2017
- Hibernate中的merge使用详情解说
- spring secrity 自定义验证
- Android stdio 打Release包步骤
- 创建 vxlan 并部署 instance