”明月如霜,好风如水,清景无限 “
上次用了一下正则,说实话文远没弄明白,但是没关系先用bs4凑合着(文远落泪:刚又用了下正则,发现和我想象的很不一样啊)
壹
这次是一个爬取红楼梦的小栗子,网址:https://www.shicimingju.com/book/hongloumeng.html
还是分析一下:
<li><a href="/book/hongloumeng/1.html">第 一 回 甄士隐梦幻识通灵 贾雨村风尘怀闺秀a>li>
先从特征
相当清楚,
贰
上代码:
import requestsfrom bs4 import BeautifulSoupimport lxmlimport reheaders={ 'User=Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.193 Safari/537.36' }url='https://www.shicimingju.com/book/hongloumeng.html'
先还是爬前准备:
main_text = requests.get(url=url,headers=headers).textsoup = BeautifulSoup(main_text,'lxml')li_all=soup.select('.book-mulu > ul >li')
这里用到了BeautifulSoup对象实例化,也是本次操作的重点,可以说select方法是bs4对象的一个最重要的方法,主要是因为层级定位,我们知道,数据解析的作用就是匹配到你想要的数据,而select方法这种方便的标签层级定位就相当方便了。(bs4是python独有的)
attr1={'class':'chapter_content'}f=open('红楼梦.txt','w',encoding='utf-8')for li in li_all: page_title=li.a.string page_url='https://www.shicimingju.com'+li.a['href']# print(page_url) detail_text=requests.get(url=page_url,headers=headers).text detail_soup=BeautifulSoup(detail_text,'lxml') content_part=detail_soup.find('div',attr1)# print(content_part) # 得到本章所有段落 content=content_part.text # 持久化存储 f.write(page_title+' : '+content+'\n\n') print(page_title+': 本章下载完成!!!!!!!!!!!!!!!!')
此时要注意的是,正文界面的soup要再次实例化,detail_soup需要传入正文界面的字符串响应,这里正好涉及到soup对象的另外的方法,find函数。
根据这几个例子的结果,文远觉得这三个方法还是比较容易理解的。
叁
比较一下三个,text,string,get_text()的区别:
在最具体层级的标签下,标题本身也就是li.a的内容,此时三个方法一样,而实际上,string 只能获得本层级的内容,如下例子: 当然正文网址可以自己构建,规律很明显:
new_url='https://www.shicimingju.com/book/hongloumeng/{}.html'for i in range(1,121): print(new_url.format(i)) Nurl=new_url.format(i)
肆
最后放一下,爬取的内容:
后期应该会尝试一下红楼梦的词云,尽请期待,有意思的是这个网站在爬了两次之后就拒绝访问报错如下:(还是尽量在爬取时加延迟啥的,不妨碍人家网站正常运行比较好)
ConnectionError: HTTPSConnectionPool(host='www.shicimingju.com', port=443): Max retries exceeded with url: /book/hongloumeng.html (Caused by NewConnectionError(': Failed to establish a new connection: [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。',))
再加一下文远尝试正则的失败代码:(不知道大佬们有没有啥好建议)
这是部分main_text内容:
class="book-mulu"> <ul>
<li><a href="/book/hongloumeng/1.html">第 一 回 甄士隐梦幻识通灵 贾雨村风尘怀闺秀a>li>
<li><a href="/book/hongloumeng/2.html">第 二 回 贾夫人仙逝扬州城 冷子兴演说荣国府a>li>
#### 失败ex_code-snippet__string">"book-mulu">.*?title_list=re.findall(ex_title,main_text,re.S)print("len:",len(title_list))print(title_list)### 输出如下len: 1['/book/hongloumeng/1.html']
END
作者:不爱夜跑的影迷不是好程序猿
喜欢的话请关注点赞? ?? ?
壹句 : 东风破