咸阳工商招标信息抓取

咸阳工商招标信息抓取

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

分析网站

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

代码实现

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

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()

结语

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

你可能感兴趣的:(python,爬虫)