您的位置:首页 > 理论基础 > 计算机网络

《从零开始学Python网络爬虫》CH5

2017-12-28 16:50 211 查看

Case1 爬取豆瓣图书TOP250的数据

案例描述



爬取豆瓣图书Top250所有书籍的书名、作者、评分及打分人数、短评、封面网址,并保存为csv格式的文件。以上图为例子,爬取《追风筝的人》、胡塞尼、评分8.9、296341评价、“为你,千千万万遍”等信息。原网址为:https://book.douban.com/top250?start=0;代码如下

# -*- coding: utf-8 -*-

import requests as req
from lxml import etree
import csv
import time

header = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'}
f = open('douban_book_250.csv', 'w+', encoding = 'utf-8')
doubanbook = csv.writer(f)
doubanbook.writerow(('book', 'writer', 'rate', 'reader', 'comment', 'cover'))

for i in range(0, 10):
print('--------------------现在开始爬取第' + str(i+1) + '页--------------------')
url = 'https://book.douban.com/top250?start=' + str(25*i)
response = req.get(url, headers = header)
xml = etree.HTML(response.content)

for j in range(1,26):

books_xpath = '//*[@id="content"]/div/div[1]/div/table[' + str(j) + ']/tr/td[2]/div[1]/a/text()'
books = xml.xpath(books_xpath)[0].strip()

writers_xpath = '//*[@id="content"]/div/div[1]/div/table[' + str(j) + ']/tr/td[2]/p[1]/text()'
writers = xml.xpath(writers_xpath)[0].strip()

ratings_xpath = '//*[@id="content"]/div/div[1]/div/table[' + str(j) + ']/tr/td[2]/div[2]/span[2]/text()'
ratings = xml.xpath(ratings_xpath)[0].strip()

readers_xpath = '//*[@id="content"]/div/div[1]/div/table[' + str(j) + ']/tr/td[2]/div[2]/span[3]/text()'
readers = xml.xpath(readers_xpath)[0].strip('()').strip()

comments_xpath = '//*[@id="content"]/div/div[1]/div/table[' + str(j) + ']/tr/td[2]/p[2]/span/text()'
comment = xml.xpath(comments_xpath)
if len(comment) != 0:
comments = xml.xpath(comments_xpath)[0].strip()
else:
comments = '空白'

imgs_xpath = '//*[@id="content"]/div/div[1]/div/table[' + str(j) + ']/tr/td[1]/a/img/@src'
imgs = xml.xpath(imgs_xpath)[0].strip()

doubanbook.writerow((books, writers, ratings, readers, comments, imgs))

print(books)
print(writers)
print(ratings)
print(readers)
print(comments)
print(imgs + '\n')

time.sleep(0.5)
print(3*'\n')

f.close()
print('OK')


代码分析

1、1-7行,导入必要的包。csv包用于将数据存储为.csv格式文件;

2、8-10行,简历请求头,新建文件douban_book_250.csv作为保存爬取信息的文件,w+表示以写入方式打开f,
encoding = 'utf-8'
表示编码方式,这一句一定不能删除,否则会编码冲突并报错;

3、13-17行,遍历豆瓣读书Top250所有的网页,一共有10页,每页25部书,因此遍历10次;分析其url即可构造链接;获取每个url对应的requests类和xml类;

4、19-41行,通过浏览器F12-Copy Xpath功能,构造每部书的书名、作者、读者、评分、图片等信息,通过
[0].strip()
取出字符并去掉字符前后的空格,将其保存到books、writers、imgs等变量中;易错点:在获取原始的xpath中,要把
/tbody
这标签去掉,否则爬虫读不出来;

5、43-56行,通过csv.writer类的writerow函数,将上述books、writers、imgs写入到csv文件当中;在Ipython中打印出这些信息,方便调试;最后,通过time.sleep伪装成用户访问网页,防止反爬。

Case2 爬取起点中文网小说信息

案例描述

与Case1类似,爬取起点中文网1-10页的网文信息,网址为:https://www.qidian.com/all;与上面的例子几乎是一样的实现方法,思路总结如下:

1、导入必要的网页解析库,并新建csv/xls文件;

2、分析待爬取网页的url,构造for循环;

3、通过浏览器F12-Copy Xpath/Select,配合lxml、bs4获取特定信息对应的html文本,将其数据清洗、然后写入csv文件当中;

4、给定header和time.sleep,防止反爬。搞定~

本例的代码就不详细解释了。值得一提的是,第9行的
newline=''
最好不要省略,否则在csv中会出现间隔一行才保存一段信息的效果;第11行
writer.writerow
后面的变量,一定要有两个括弧,小心弄错了。

# -*- coding: utf-8 -*-

from lxml import etree
import requests as req
import csv
import time

header = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'}
f = open('5.4.csv', 'wt', newline='', encoding = 'utf-8')
writer = csv.writer(f)
writer.writerow(('书名', '作者', '大类别', '小类别', '简介', '字数'))

for i in range(1,4):
print('现在爬取第' + str(i) + '页')
url = 'https://www.qidian.com/all?orderId=&style=1&pageSize=20&siteid=1&pubflag=0&hiddenField=0&page=' + str(i)
print(url + '\n')
response = req.get(url, headers = header)
xml = etree.HTML(response.content)

for j in range(1,5):
book_names = xml.xpath('/html/body/div[2]/div[5]/div[2]/div[2]/div/ul/li[' + str(j) + ']/div[2]/h4/a/text()')[0].strip()
writers = xml.xpath('/html/body/div[2]/div[5]/div[2]/div[2]/div/ul/li[' + str(j) + ']/div[2]/p[1]/a[1]/text()')[0].strip()
class1es = xml.xpath('/html/body/div[2]/div[5]/div[2]/div[2]/div/ul/li[' + str(j) + ']/div[2]/p[1]/a[2]/text()')[0].strip()
class2es = xml.xpath('/html/body/div[2]/div[5]/div[2]/div[2]/div/ul/li[' + str(j) + ']/div[2]/p[1]/a[3]/text()')[0].strip()
infos = xml.xpath('/html/body/div[2]/div[5]/div[2]/div[2]/div/ul/li[' + str(j) + ']/div[2]/p[2]/text()')[0].strip()
lengthes = xml.xpath('/html/body/div[2]/div[5]/div[2]/div[2]/div/ul/li[' + str(j) + ']/div[2]/p[3]/span/text()')[0].strip()

writer.writerow((book_names, writers, class1es, class2es, infos, lengthes))

print(book_names)
print(writers)
prin
ab48
t(class1es)
print(class2es)
print(infos)
print(lengthes + '\n')
time.sleep(0.3)

f.close()
print('OK')
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: