《从零开始学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')
相关文章推荐
- 从零开始学python网络爬虫
- 《从零开始学Python网络爬虫》CH3
- 《从零开始学Python网络爬虫》CH8
- 《从零开始学Python网络爬虫》CH6
- 《从零开始学Python网络爬虫》CH7
- 《从零开始学Python网络爬虫》CH9
- 《从零开始学Python网络爬虫》CH10
- 《从零开始学Python网络爬虫》实战案例目录
- 《从零开始学Python网络爬虫》CH4
- 《从零开始学Python网络爬虫》CH12
- [Python]网络爬虫(十):一个爬虫的诞生全过程(以山东大学绩点运算为例)
- 从零开始python小案例003计算北京市个人所得税
- 【推荐】只需十四步:从零开始掌握Python机器学习
- 从零开始学习Python十分钟快速入门
- Python网络爬虫专业级框架_scrapy
- 网络爬虫,python和数据分析学习--part3
- [Python]网络爬虫(一):抓取网页的含义和URL基本构成
- 用Python从零开始创建区块链
- Python网络爬虫(Get、Post抓取方式)
- [Python]网络爬虫(三):使用cookiejar管理cookie 以及 模拟登录知乎