python 爬取网页动态部分

有些网页在进行换页时,只是改动很小的部分,绝大多数位置不变,那么网页制作的过程中就不会更改初始的url,只是调整内部部分。这种改动我现在了解到的使用javascript来进行。js

表现就是,在同一个url下,点击不同的查询页,出现不同的数据。比如评论的分页等。

这个情况下,爬取的主体部分是不变的,需要调整的是url部分,需要找到正确的url。

爬取过程仍然是

1、通过url读取到网站网页

2、将网站的文本数据读取

3、通过正则表达寻找数据

4、保存需要的数据

5、数据处理,这里不是爬虫的内容

后边几步不变,需要调整第一步的url

比如上交所网站查询上海市场的平均PE数据,但是每次只能查询某一天的数据

python 爬取网页动态部分_第1张图片

首先是查看f12的开发者工具,查看network下js项目,当选好一个日期点击查询时,js下就会多出一条记录。

点击该记录,就会出现headers的全部信息。

python 爬取网页动态部分_第2张图片

这里有4部分,第一部分就是网页的url等内容,第2部分是服务器的回应部分,第三部分是自己的信息,第四部分暂时不理解。

我的理解是,这部分动态内容是有自己的url的,也就是headers/General/Request URL的内容。但是这部分内容不是直接显示在网页上的,而是显示在网页上的某一部分内。形成了动态的内容,不知道理解的对不对,没有接触过网页编辑。

所以这部分js内容有了自己的url,某些网站通过这个url就可以直接走接下去的爬虫流程就可以拿到动态网页的内容。比如京东、淘宝、携程等评论就是这样。


但是有些js内容虽然有url,但是不允许通过这种方式直接在网页上显示,只接受从浏览器端读取。那么直接走爬虫流程就无法得到数据,需要设置浏览器浏览的方式进行爬取。方法是用urllib.request.Request来设置headers

headers包含很多内容,比如Accept, Accept-Encoding, Accept-Language, Connection, Cookies, Host,  Referer,  User-Agent等内容。

据我了解,反爬有些是通过User-Agent的内容来控制,因为python默认的User-Agent是python,而不是浏览器,所以反反爬时有时候需要设置User-Agent

这里,上交所是通过Referer来控制爬虫的。所以需要在headers里设置好referer


具体编码为

import urllib.request as url_request
import re
获取单日数据
def get_content(url):
    header = {'Referer': 'http://www.sse.com.cn/market/stockdata/overview/day/',
              'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3418.2 Safari/537.36'}

    req = url_request.Request(url, headers=header)
    url_content = url_request.urlopen(req).read().decode('utf-8')
    reg = r'"profitRate":"(.*?)","profitRate1"'
    content = re.findall(reg, url_content, re.S)
    return content

获取多日数据

def get_url():
    content = []
    for i in ["2018-05-04","2018-05-07","2018-05-08"]:
        url = "http://query.sse.com.cn/marketdata/tradedata/queryTradingByProdTypeData.do?jsonCallBack=jsonpCallback8286&searchDate="+i+"&prodType=gp&_=1525914100378"
        content.append(get_content(url))
    return content

执行代码

if __name__ == "__main__":
    print(get_url())

结果为

[['15.08', '12.35', '15.08'], ['15.31', '12.48', '15.3'], ['15.44', '12.53', '15.43']]

你可能感兴趣的:(python)