咸阳工商招标信息抓取

咸阳工商招标信息抓取

最近有个搞爬虫的朋友让我帮他看下咸阳工商招标信息是怎么抓取的,一些参数他无法获取。经过分析之后,发现搞爬虫,思路是真的重要。

分析网站

网站url: http://www.xyjsgc.com/website/main/Channel.aspx?fcol=122002
通过打开url,获取请求信息:
在这里插入图片描述
可以看到,每次的请求都带上了多个参数,而且看起来毫无规律(我朋友就卡在这里),每次到了这个时候,就更不能着急,这些参数的存在,无非就几种情况:
1、页面自带
2、点击后通过调用前端js代码生成
点击下一页发现,参数是一直变化的,对比前一页的源码,幸运地,这个是在页面代码中直接提供:在这里插入图片描述
就这样,我用几分钟的时间,完成了他几天没有搞出来的东西😂。

代码实现

找到了规律,一切就好办了,通过构造参数,完成模拟请求,就完事了:

import requests
from bs4 import BeautifulSoup


headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36'
}


def get_detail_data(soup):
    """
    获取详细数据
    :param soup:
    :return:
    """
    tr_lists = soup.find_all('tr', {'class': 'nslist'})
    xy_main_url = 'http://www.xyjsgc.com/website/main/'
    for tr in tr_lists:
        title = tr.find('a')['title']
        detail_url = '{}{}'.format(xy_main_url, tr.find('a')['href'])
        print(title)


def xy_business_circles(datas={}):
    """
    抓取咸阳的招标信息
    :param datas:请求的参数
    :return:
    """
    url = 'http://www.xyjsgc.com/website/main/Channel.aspx?fcol=122002'
    # r = requests.get(url, headers=headers) if datas else requests.post(url, datas=datas, headers=headers)
    r = requests.post(url, data=datas, headers=headers)
    soup = BeautifulSoup(r.text, 'html.parser')
    get_detail_data(soup)
    if '下一页' in r.text:
        datas ={
            '__EVENTTARGET': 'Pager1$lb_Next',
            '__EVENTARGUMENT': '',
            '__LASTFOCUS': '',
            '__VIEWSTATEGENERATOR': '1B79AC81',
            'cl1$KeyWord1': '',
            'Pager1$NavPage': ''
        }
        datas['__EVENTVALIDATION'] = soup.find('input', {'name': '__EVENTVALIDATION'})['value']
        datas['__VIEWSTATE'] = soup.find('input', {'name': '__VIEWSTATE'})['value']
        print(datas)
        xy_business_circles(datas)


if __name__ == '__main__':
    data_list = []
    xy_business_circles()

结语

爬虫更靠思路,找到解决问题的思路,比敲更多的代码更有效,不要一味蛮干,得要有点巧劲。附上代码地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章