Python爬虫——百度

之前学过Python,并且还写了几个小东西。

这两天又复习了一下,写了个百度的爬虫,中间遇到了几个问题,并且解决了。记录一下

1.urllib2没有head方法?

因为爬出来百度的链接都是类似于http://www.baidu.com/link?url=sl-IoZodQ1PNDKMb37W-ZcDlEW_zmzAsAt49XsN8YcG然后302到目标站点的,用urlopen的话是get方式获取目标网页的,这样每个链接都要获取一遍导致爬虫特别慢。既然是302的话,那么只需要获取返回包的location就可以了。由于没找到urllib2的head方法,就换成了requests。

url = requests.head(urls).headers['location']

2.还有就是刚换成requests的时候,我获取网页内容是用的

requests.get(target).text

结果编码问题总是出错,后来朋友说换成.content 网上查了一下,text是以字符串方式读取,content是以字节方式请求的,他会自动的处理一些编码问题。

直接上源码了,换了head方式获取以后,嗖嗖的爬,好爽啊!

#!/usr/bin/env python
#coding:utf-8
__author__ = 'xMyth.mtfly'

import requests
import string
import sys
import re

def get_urls(target, keywords, pn):
	response = requests.get(target)
	html = response.content
	s = re.findall(u'href = "(.*?)"', html)
	print s
	f = open(str(pn/50+1) + 'out.txt', 'w+')
	for urls in s:
		print urls
		response = requests.head(urls)
		urls_head_location = response.headers['location']
		print urls_head_location
		f.write(urls_head_location + '\n')
	f.close()
	print 'hello~'

def main():
	page = 5 #设置页数每页50条
	keywords = 'hack tools' #设置关键字
	for pages in range(page):
		print pages
		pn = 50 * pages
		print pn
		target = 'http://www.baidu.com/s?ie=utf-8&rn=50&pn=%d&wd=%s' % (pn,keywords) #每页50个
		get_urls(target, keywords, pn)
	print 'all done!'

if __name__ == '__main__':
        main()

One comment on “Python爬虫——百度

Comments are closed.