鱼C论坛

 找回密码
 立即注册
查看: 2351|回复: 1

[已解决]python爬虫——爬取网页“下一页”问题

[复制链接]
发表于 2017-10-26 16:53:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
此爬虫程序用于爬取——所有在PS吧中,留下的邮箱账号
发送源代码:
import requests
import re

headers ={"User-Agent":"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"}

def getArticleList(pn=1):
    response = requests.get("http://tieba.baidu.com/f/search/res?isnew=1&kw=&qw=ps%BD%CC%B3%CC%20%D3%CA%CF%E4&rn=10&un=&only_thread=1&sm=1&sd=&ed=&pn={}".format(pn),headers =headers)
    html = response.text
    reg = r'"(/p/\d+\?pid=\d+&cid=0#\d+)"'
    return re.findall(reg,html)

def getArticleContent(url):
    html = requests.get("http://tieba.baidu.com{}".format(url),headers = headers).text
    reg = r'[0-9a-zA-Z-_\.]+@[0-9a-zA-Z-_\.]+\.[a-zA-Z]+'
    mailList = re.findall(reg,html)
    fn = open("E:\数据分析师\python\python基础\python 练习\python1.1.txt","a")
    for mail in mailList:
        fn.write("{}\n".format(mail))
    fn.close()
    reg = r'<a href="/p/\d+\?pn=\d">下一页</a>'
    net = re.findall(reg,html)
    print net
    if not net:
        print "已经是最后一页"
        return
    else:
        print "正在爬取下一页"
        getArticleContent(net[0])


for pn in range(1,39):
    print "正在爬取第{}页的数据".format(pn)
    for articleUrl in getArticleList(pn):
        getArticleContent(articleUrl)

files = open("E:\数据分析师\python\python基础\python 练习\python1.1.txt").readlines()
files = set(files)

with open("E:\数据分析师\python\python基础\python 练习\python1.1.txt","w") as fn:
    for i in files:
        fn.write(i)

print "搞定"

if __name__ == "__main__":
    getArticleList()

红色背景的代码存在问题
问题如下:
一个网页内存在分页,需要爬取每一个分页。上面的代码无法爬取下一页。
下面是对问题代码的拆系:如下

def get():
    response = requests.get("http://tieba.baidu.com/p/5262776557?pn=1")   
#此URL为爬取的一个页面,可以看出此页面有4个分页.
    html = response.text
    reg = r'<a href="(.*?)">下一页</a>'   
#如果该页面不是最后一页的话,该页面会存在“下一页”的链接,审核该元素,发现其正则表达式为reg.
    net = re.findall(reg,html)
    print net
#然而,最终得到的net始终为空列表。

if __name__ == "__main__":
    get()

请问,代码有什么问题?多谢指教。
最佳答案
2017-10-26 17:06:04
本帖最后由 jerryxjr1220 于 2017-10-26 17:17 编辑

你用的是python2吧,你的正则表达式有问题。
reg = r'<a href="(.*?)">下一页</a>' 在python2中是匹配不出来的。
换python3的话是可以匹配的。

或者你在代码头部加上编码
  1. # -*- coding: cp936 -*-
  2. html = '<a href="/p/5262776557?pn=4">下一页</a>'

  3. import re

  4. print re.findall(r'<a href="(.*?)">下一页</a>', html)
复制代码

这样就可以匹配了
=================== RESTART: C:\Users\xuj06\Desktop\tt.py ===================
['/p/5262776557?pn=4']
>>>
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-10-26 17:06:04 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jerryxjr1220 于 2017-10-26 17:17 编辑

你用的是python2吧,你的正则表达式有问题。
reg = r'<a href="(.*?)">下一页</a>' 在python2中是匹配不出来的。
换python3的话是可以匹配的。

或者你在代码头部加上编码
  1. # -*- coding: cp936 -*-
  2. html = '<a href="/p/5262776557?pn=4">下一页</a>'

  3. import re

  4. print re.findall(r'<a href="(.*?)">下一页</a>', html)
复制代码

这样就可以匹配了
=================== RESTART: C:\Users\xuj06\Desktop\tt.py ===================
['/p/5262776557?pn=4']
>>>
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-12 11:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表