python爬虫urllib(二)

import urllib.request
import urllib
import re
def demo(url):
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}
    html=urllib.request.Request(url=url,headers=headers)
    html_w=urllib.request.urlopen(html).read().decode("utf-8")
    reg=r'<p>(.*?)<p>'
    regg=r'<h3 class="j_chapterName">(.*?)</h3>'
    regg=re.compile(regg)
    reg=re.compile(reg)
    result=re.findall(reg,html_w)
    result_title=re.findall(regg,html_w)
    file=open("c.txt","a")
    for i in result_title:
        print(i)
        file.write('\n'+i+'\n')
    for j in result:
        j = j.replace(" ", "")
        j = j.replace("\u3000", "")
        print(j)
        file.write(j+'\n')
def getNovelContent(url):
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}
    htm=urllib.request.Request(url=url,headers=headers)
    html = urllib.request.urlopen(htm).read().decode("utf-8")
    reg=r' <a id="j_chapterNext" href="(.*?)" data-eid="qd_R109" >.*?</a>'
    reg=re.compile(reg)
    result=re.findall(reg,html)
    for i in result:
        i="https:"+i
        return i
if __name__ == '__main__':
    demo("https://read.qidian.com/chapter/JXV9iAzXh5vWqUKqg3FQnA2/SRpuPFULZUTgn4SMoDUcDQ2")
    url = getNovelContent("https://read.qidian.com/chapter/JXV9iAzXh5vWqUKqg3FQnA2/SRpuPFULZUTgn4SMoDUcDQ2")
    while(1):
        print("\n")
        demo(url)
        url=getNovelContent(url)

先上完整代码。这里爬的是起点小说网整本小说,小说地址:https://read.qidian.com/chapter/JXV9iAzXh5vWqUKqg3FQnA2/SRpuPFULZUTgn4SMoDUcDQ2
通过对网页源代码的分析我们发现小说标题在h3标签内,正文在p标签内。
首先我们来获取标题,利用正则表达式进行简单匹配

regg=r'<h3 class="j_chapterName">(.*?)</h3>'
regg=re.compile(regg)
result_title=re.findall(regg,html_w)
print(result_title)

获取第一章标题后,紧跟着正文

reg=r'<p>(.*?)<p>'
reg=re.compile(reg)
result=re.findall(reg,html_w)
print(result)

输入后会发现,输入的是列表类型,我们只需要利用for循环将内容提出来即可。并且正文中输出后会有\u3000和空格,运用replace将其用""替换掉

		reg=r'<p>(.*?)<p>'
        regg=r'<h3 class="j_chapterName">(.*?)</h3>'
        regg=re.compile(regg)
        reg=re.compile(reg)
        result=re.findall(reg,html_w)
        result_title=re.findall(regg,html_w)
        for i in result_title:
            print(i)
        for j in result:
            j = j.replace(" ", "")
            j = j.replace("\u3000", "")
            print(j)

爬小说当然不能只爬一章,在源代码处我们发现有下一章链接可以链接到下一章,同理可爬第二章,最后利用while循环即可讲整本书爬下来。
在这里会发现这个链接少了https: 所以在给函数传递值的时候不要忘记在获取到的链接前加上它。

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}
htm=urllib.request.Request(url=url,headers=headers)
html = urllib.request.urlopen(htm).read().decode("utf-8")
reg=r' <a id="j_chapterNext" href="(.*?)" data-eid="qd_R109" >.*?</a>'
reg=re.compile(reg)
result=re.findall(reg,html)
for i in result:
   i="https:"+i
   return i

最后就可以写入文件啦,这里说明一下open(“文件名.txt”,“a”)

’r’:只读
‘w’:只写
‘a’:追加
‘r+’ == r+w(可读可写,文件若不存在就报错(IOError))
‘w+’ == w+r(可读可写,文件若不存在就创建)
‘a+’ ==a+r(可追加可写,文件若不存在就创建)
对应的,如果是二进制文件,就都加一个b就可以了:
‘rb’  ‘wb’  ‘ab’  ‘rb+’  ‘wb+’  'ab+'

写入的时候不要忘记换行啦,否则写入的小说就在同一行了。

全部评论

相关推荐

11-24 19:04
已编辑
湖南工商大学 Java
点赞 评论 收藏
分享
Yushuu:你的确很厉害,但是有一个小问题:谁问你了?我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了😆
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务