Python 爬虫入门的第一课

学习 Python 也有一段时间,在 Google 上看到大家都拿豆瓣电影来练手,今天我也来练练手,使用 python 来抓取豆瓣电影的 Top250 的榜单并保存到 Excel 中。

这其中会使用的库有:

reqeusts 网络请求库,用来访问网络并返回请求结果,这里用来返回网页的html

lxml 解析库,用来解析html,本次使用的是 xpath

re 正则表达式库,用来对字符串进行匹配

csv 访问csv文件的库,用来写入文件

先来看看豆瓣电影的 Top250 的页面是什么样?

我们主要抓取片名、导演、主演(取第一个)、年份、国家和评分。

通过 chrome 的开发者工具,可以很轻松的找到我们需要的 xpath,如下图:

按F12 展示出 Elements 后,通过左上角的小箭头点击需要的元素,上图选中的是片名,此时在片名上右键会出现列表,选中 copy -> xpath 就获取到我们需要的

获得的 xPath 是其中一个片名的,多获取几个会发现有规律,很容易总结出规则。

好了,说了这么多,还是那句话,show me your code!

importrequests

fromlxmlimporthtml

importre

importcsv

#解析html网页

defparse_tree(url):

r=requests.get(url)

tree=html.fromstring(r.text)

returntree

#获取title

defget_title(tree):

titles=tree.xpath('//*[@id="content"]/div/div[1]/ol/*/div/div[2]/div[1]/a/span[1]/text()')

arr_title=[]

# print(titles)

fortitleintitles:

arr_title.append(str(title))

# print(arr_title)

returnarr_title

#获取导演和主演,只取第一个名字

defget_da(tree):

doctor=tree.xpath('//*[@id="content"]/div/div[1]/ol/*/div/div[2]/div[2]/p[1]/text()[1]')

da=[]

fordindoctor:

# print(d)

dd=re.split(r'[\s\\xa0]',str(d))

# print(dd)

dactor=''

actor=''

forsindd:

if'导演'ins:

index1=dd.index(s)

ifindex1+1

dactor=dd[index1+1]

elif'主演'ins:

index=dd.index(s)

ifindex+1

actor=dd[index+1]

break

arr=[dactor,actor]

da.append(arr)

# print(da)

returnda

#获取年份

defget_years(tree):

years=tree.xpath('//*[@id="content"]/div/div[1]/ol/*/div/div[2]/div[2]/p[1]/text()[2]')

arr_year=[]

foryinyears:

year=str(y).strip('\n').strip().split('\xa0/\xa0')

arr_year.append(year)

# print(arr_year)

returnarr_year

#获取评分

defget_rate(tree):

rates=tree.xpath('//*[@id="content"]/div/div[1]/ol/*/div/div[2]/div[2]/div/span[2]/text()')

arr_rate=[]

# print(rates)

forrinrates:

arr_rate.append(str(r))

# print(arr_rate)

returnarr_rate

#将结果拼接到result中

defappend(result,arr_title,arr_da,arr_year,arr_rate):

foriinrange(len(arr_title)):

a=(arr_title[i],arr_da[i][],arr_da[i][1],arr_year[i][],arr_year[i][1],arr_year[i][2],arr_rate[i])

result.append(a)

result_title=['名字','导演','主演','年份','国家','类型','评分']

result=[]

foriinrange(10):#一共10页

count=i*25#每页25条数据

url='https://movie.douban.com/top250?start=%d'%(count)#拼接每页的url地址

print(url)

tree=parse_tree(url)#解析html

#拼接数据到result中

append(result,get_title(tree),get_da(tree),get_years(tree),get_rate(tree))

#输出一下看看结果

print(result_title)

forrinresult:

print(r)

#保存到csv中, newline字段是设置换行,默认是'\n',会直接在csv中插入空行

csvfile=open('douban_top250.csv','w',encoding='gb18030',newline='')

writer=csv.writer(csvfile)

#先写入title

writer.writerow(result_title)

print('====================')

forrinresult:

print(r)

#写入每一条数据,如果出错则跳过该条数据

try:

writer.writerow(r)

except:

continue

csvfile.close()#最后关闭文件

好了,是不是很简单,我们来看一下结果

so Easy 吧!

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180119G03NAX00?refer=cp_1026

扫码关注云+社区