前几天我工作上的导师要我帮他写一个小爬虫。需要爬下新浪网上的有关关键字的新闻,把包含关键字的新闻内容查爬出来。
接下来就开始边做边记录下心得吧!!!
爬虫需要请求url,则需要导入requests包,要查找html页面里的内容,则需导入BeautifulSoup包
方便导入,可以这样:file -> settings -> 点右上方的 “+” 号,然后在新的页面的搜索栏搜索即可。
import requests
from bs4 import BeautifulSoup
1、首先建一个News的类,创建构造函数:
def __init__(self,searchName,searchArea='news'):
self.head = {
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/61.0.3163.79 Safari/537.36"
}
self.searchName = searchName
self.searchArea = searchArea
self.urlData = [] #爬取数据的存储
我的思路是这样的 先在新浪自带搜索栏,搜一个大范围的包含特定字符串的新闻出来,然后再从这里面筛选。
首先查出来的结果是分了很多页的:
那我们需要去找到url之间的规律,分析下url规律:
q=%C8%CB%BF%DA:这个其实就是中文的你想要搜索的内容 ,这里换了编码
c=news :代表的是新闻板块
page=1 :代表的是哪一页
经过测试发现,后面的那些参数可有可无,主要就是这3个参数。
然后按F12,看html里每条新闻对应的url怎么可以获取到:
可以看到,我们找到了每条新闻对应的url和标题!
然后开始写方法,获取分页数据,先测试下可不可以获取第二页数据:
def get_data(self):
url = 'https://search.sina.com.cn/?q={}&c={}&ie=utf-8&sort=time&page={}'
responses = requests.get(url.format(self.searchName,self.searchArea,2),headers=self.head)
html = responses.text
soup = BeautifulSoup(html, 'lxml')
reg = soup.select('h2 a') #查找html 里面的<h2> 标签下的<a>标签里的内容
print(reg)
然后造对象,执行方法,一执行发现无论怎么都获取的是第一页的数据!!!第一页只有四条数据!哎呀糟心啊
然后网上开始找资料ing........
然后发现header里的bug, 之前的是我从浏览器header里直接复制过去的...然后发现格式不对,于是乎改成:
self.head = {
"Mozilla/5.0 " : "(Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) " "Chrome/61.0.3163.79 Safari/537.36" }
然后我天真的以为是这个问题,就又去执行,结果还是不行....
后面我又继续找,我看控制台里请求的header 里的内容,想着 我先试试照着控制台里的这些格式传下:
然后就改成了如下:
self.head = {
'User-Agent' :"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/61.0.3163.79 Safari/537.36"
}
结果还是只有第一页....
我找资料里全是header传的只有这个浏览器的header,没有其他...(是这里误导了我)
后面发现其实cookie也很重要,header里也需要加上:
self.head = {
'User-Agent' :"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/61.0.3163.79 Safari/537.36",
'Cookie' : "U_TRS1=0000007f.3534544b.5ce35c4f.3c257585; U_TRS2=0000007f.353c544b.5ce35c4f.18b278dd"
}
最后可以根据url获取任意页的内容!!!
所以! 最靠谱的还是看浏览器的header里怎么传的,一般常用的有下面这些:
1.Host
2.Connection
3.Accept
4.User-Agent
5.Referrer
6.Accept-Encoding
7.Accept-Language
8.Cookie