python3爬虫记(一)------------------利用 requests 和 lxml 爬取小说
PS 本人第一次写博客,写的不好和不对的地方请见谅,欢迎各位指出和交流。
(使用的是 anaconda3)
(这里用到的requests 和 lxml 的详细内容参见 http://docs.python-requests.org/zh_CN/latest/index.html http://lxml.de/4.2/lxmldoc-4.2.1.pdf )
最近在学python的爬虫,所以想试试爬取一下啊小说,废话不多说,直接搞起。
首先百度一下小说,例如“牧神记”吧
直接进入到第一个“幻月书院”
1.一般我们在爬取可以先去看看网站的 robots.txt 文件 例如“幻月书店”的,输入http://www.huanyue123.com/robots.txt 即可。得到一下内容
User-agent: * Disallow: /register.php Disallow: /login.php Disallow: /modules/ Disallow: /files/ Disallow: /getpass.php Disallow: /index.php Sitemap:http://www.huanyue123.com/xml/sitemap.xml
很显然,看字面的意思就可以看出上面的内容表示了一些所有用户都不应该爬取的内容(然而并没有什么软用,全看自己,这里并不鼓励大家爬取,只是学习一下技术)
其中,Sitemap是网址的导航,显示网站理由哪些网页(有些情况下可以偷懒,直接根据它里面的内容来找简化爬取过程,但是Sitemap由于更新不一定及时的原因,达不到很好的效果)。以下是“幻月书院的“Sitemap”(好像并没有什么用)
http://www.huanyue123.com/xml/1.xml http://www.huanyue123.com/xml/2.xml
http://www.huanyue123.com/xml/3.xml http://www.huanyue123.com/xml/4.xml
http://www.huanyue123.com/xml/5.xml http://www.huanyue123.com/xml/6.xml
http://www.huanyue123.com/xml/7.xml http://www.huanyue123.com/xml/8.xml
http://www.huanyue123.com/xml/9.xml http://www.huanyue123.com/xml/10.xml
http://www.huanyue123.com/xml/11.xml http://www.huanyue123.com/xml/12.xml
http://www.huanyue123.com/xml/13.xml http://www.huanyue123.com/xml/14.xml
http://www.huanyue123.com/xml/15.xml http://www.huanyue123.com/xml/16.xml
http://www.huanyue123.com/xml/17.xml http://www.huanyue123.com/xml/18.xml .......
可以看到,我们需要的小说内容在id="htmlContent",class="contentbox"的div标签里。我们除了关心这一页的内容,还应该关心下一页的网址,如下图
可以看到地址在class="next pager_next"的 a 标签的href属性里
现在我们知道了要爬取的内容后,就可以开始了。
3.先爬去第一章 (anaconda3 自带的 jupyter notebook)
应该很清楚吧
4.爬去整本小说
做法类似于上面只不过加了一点点小东西
直接上代码吧
import requests from lxml import etree import time import random headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:59.0) Gecko/20100101 Firefox/59.0', 'Referer':'http://www.huanyue123.com/book/' } base_url = "http://www.huanyue123.com/" def html_download(url): return requests.get(url,headers=headers) def text_download(text): txt = etree.tostring(text, method="text", encoding='utf').decode('utf') pretty_text=txt.replace("\xa0","") prettier_text = pretty_text.replace("\r\n", "").replace("章节错误,点此举报(免注册)",'') with open('mushenji.txt' ,'a') as f: f.write(prettier_text) def link_crawl(): seed_url = ['http://www.huanyue123.com/book/37/37849/22075553.html'] seen = set() while len(seed_url) !=0: url = seed_url.pop() secs = random.random()+3 time.sleep(secs) response = html_download(url) response.encoding = "gbk" if response.status_code ==200: html = etree.HTML(response.text) text = html.xpath("//div[@id='htmlContent']")[0] next = html.xpath('//a[@class="next pager_next"]')[0] text_download(text) next_url = base_url + next.get("href") if next_url not in seen: seed_url.append(next_url) seen.add(next_url) link_crawl()应该都很清楚了 只不过加了加了一个列表把要爬的url放入,以及一个集合来判断是否已经爬过,还添加了休息时间一面被禁掉ip