其实这个代码挺简单的,跟上一个药智网爬取没太大区别。
1、想说一下豆瓣的URL的问题,开始的时候总是链接失败,想说代码没问题,最有可能的就是网址的问题了
发现我的网址是直接从任务那复制粘贴的,而真正豆瓣的网址与所给的是有区别的:
#我一开始写的网址所以网址很重要,一定要事先弄清楚。
http://movie.douban.com/top250?
#正确的网址
http://movie.douban.com/top250?start=0&filter=
2、再有是逐页爬取的时候,网址的具体变化是’start=‘那
便在开头定义了一个变量 page=0和cur_url=http://movie.douban.com/top250?start={page}&filter=
另url=cur_url.format(page=pageIndex*25)
并for i in (1,10),将i的数值传入pageIndex,在下面代码中可以体现。
3、find_all()函数可以有多种用法,在这我用的是按CSS类名搜索tag的功能,其中因为class在python中是保留字,所以用class_类名搜索tag(BeautifulSoup4.1.1版本后可以使用)
下面是写的代码:
#coding=utf8
import urllib2
from bs4 import BeautifulSoup
class DB():
def __init__(self):
#定义page函数
self.page=0
self.cur_url="http://movie.douban.com/top250?start={page}&filter="
self.user_agent = 'Mozilla/4.0(compatible;MSIE 5.5;Windows NT)'
self.headers = {'User_Agent' :self.user_agent}
def getHtml(self,pageIndex):
try:
#page的变化规律
url=self.cur_url.format(page=pageIndex*25)
request=urllib2.Request(url,headers=self.headers)
response=urllib2.urlopen(request)
html=response.read()
return html
except urllib2.URLError,e:
if hasattr(e,'reason'):
print u'loading error',e.reason
return None
def getPage(self):
for i in range(0,10):
html=self.getHtml(i)
soup=BeautifulSoup(html)
#用CSS类名搜索tag
SJ=soup.find_all('div',class_='item')
print SJ
with open('douban.txt','a+') as f:
for item in SJ:
f.write(item.get_text('|',strip=True).encode('utf-8')+'\n')
spider=DB()
spider.getPage()