首先说明一下爬取思路,调用的是今日头条搜索框,爬取列表页并进入单条详情爬取详情,目的就是实现自定义关键词得到相对应的内容
我们先看网页,正常观察网页发现response里并没有网页内容
所以,我们点击Network下的XHR按钮,看看网页发送了哪些ajax请求
这时发现有两条数据,对比找一下preview里面 data 标签正式我们需要的内容,有关键词有链接有标题等等
多对比几条发现也都对的上,所以,这正是我们要的数据!
找到了数据源就要想办法爬了这里有很多条,其中不乏有我们不需要的假数据,观察发现,真是数据里都含有‘abstract’,所以我们就可以以这个词为判断依据,剔除假的,取到真的,此处上点代码
def get_articles(self):
'''获取标题和url'''
print self.url
global count
try:
response = requests.get(url=self.url)
res = json.loads(response.text)
# print response
# print res
news = res['data']
print len(news)
data_list = []
for n in news:
if n.has_key('abstract'):
data_list.append(n)
else:
pass
print data_list
print len(data_list)
for data in data_list:
# print data
self.title = data['title']
self.group_id = data['group_id']
if self.group_id:
self.url = "https://www.toutiao.com/a{}/".format(self.group_id)
else:
self.url = data['article_url']
title_list.append(self.title)
url_list.append(self.url)
# break
except urllib2.URLError, e:
print e.reason
到这一步,我们就得到了自定义关键词的标题和url信息,下面就可以进入单条爬取了
对于详情页,研究发现并不适用bs4提取,所以下面的提取我用的都是正则
按照上图操作找到文本内容,话不多说上代码
def download_article(self):
'''获取详情内容、发帖人、时间'''
for url in url_list:
response = requests.get(url=url, headers=self.headers)
try:
res = response.text
# 标题
r = re.compile(r"content:(.*?),")
result = r.findall(res)[0]
item = []
cont = re.compile(u'[\u4E00-\u9FA5]+')
data = cont.findall(result)
for i in data:
item.append(i)
content = ''.join(item).encode("utf-8")
print '内容', content
# 作者
s = re.compile(r"name:(.*?),")
source = s.findall(res)[0]
print '作者:', source
# 时间
t = re.findall('time:(.*)', res)
time = ''.join(t).encode("utf-8")
print '时间', time
except Exception as e:
pass
此贴终结(手动滑稽)~~~
需要注意的是我的环境是python2 ,原来代码中文总是提不出来,python3却可以,这个编码问题困扰了我好久,自己动手的小伙伴注意编码格式