python爬虫主要使用了urllib,urllib2,re,cookielib这几个库
首先介绍一下如何获取网页
import urllib2
url = "http://www.baidu.com/"
req = urllib2.Request(url)
response = urllib2.urlopen(req)
the_page = response.read()
print the_page
简单来说就是通过封装一个request发送到网站,获取网站信息。
而读取headers信息,可以直接通过response.info()获取。
有的时候我们需要先提交一个表单(比如登陆)跳转到一个页面才能爬取信息。
所以我们需要写一个发送的数据dict
value = {
'Username' : '120511111',
'Password' : '123456'
}
data=urllib.urlencode(value)
然后加上一些headers信息,因为有些网站不愿意别人爬取,会检查一些信息。
headers = {
'User-Agent': 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/37.0.2062.94 Chrome/37.0.2062.94 Safari/537.36',
}
然后我们就可以发送表单了
req = urllib2.Request(
url = url,
data = data,
headers = headers
)
当发送了数据的时候会判定这个request为POST类型,没有为GET类型。
另外,有的时候会判定cookie,所以我们可以加上以下内容
cookie = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
getdata = opener.open(req)
这样就获取了数据,之后怎么做就你啦(such as正则提取数据信息)。
实战
我根据这个,修改了一下,弄了个每天提取糗百的笑话的小爬虫。可惜不会在终端显示图片,那就先这样吧,学习一下scrapy框架吧。不断追求更懒才是coder的归宿。。。。
# qiubai.py
# -*- coding:utf-8 -*-
import urllib2
import re
import urllib
import thread
import time
class spider_mode(object):
def __init__(self):
self.page = 1
self.pages = []
self.enable = False
def GetPage(self, page):
my_url = "http://www.qiushibaike.com/8hr/page/" + page
user_agent = "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/37.0.2062.94 Chrome/37.0.2062.94 Safari/537.36"
headers = {'User-Agent': user_agent}
req = urllib2.Request(my_url, headers=headers)
response = urllib2.urlopen(req)
my_page = response.read()
myItems = re.findall(
'<div.*?class="content".*?title="(.*?)">(.*?)</div>', my_page, re.S)
items = []
for item in myItems:
items.append(
[item[0].replace('\n', ''), item[1].replace('\n', '')])
return items
def loadpage(self):
while self.enable:
if len(self.pages) < 2:
try:
my_page = self.GetPage(str(self.page))
self.page += 1
self.pages.append(my_page)
except:
print "can't connect to qiubai."
else:
time.sleep(1)
def showpage(self, nowPage, page):
for item in nowPage:
print "the %dth page" % page, item[0], item[1]
myinput = raw_input("q?")
if(myinput == 'q'):
self.enable = False
break
def Start(self):
self.enable = True
page = self.page
print "downloading ..."
thread.start_new_thread(self.loadpage, ())
while self.enable:
if self.pages:
nowPage = self.pages[0]
del self.pages[0]
self.showpage(nowPage, page)
page += 1
print "please enter:"
raw_input()
mymodel = spider_mode()
mymodel.Start()