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+'
写入的时候不要忘记换行啦,否则写入的小说就在同一行了。