分析网站
其实爬虫最重要的是前面的分析网站,只有对要爬取的数据页面分析清楚,才能更方便后面爬取数据
目标站和目标数据
目标地址:http://www.hshfy.sh.cn/shfy/gweb/ktgg_search.jsp
目标数据:目标地址页面的中间的案开庭公告数据
对数据页面分析
从打开页面后可以看到默认的数据是一个月的数据,即当天到下个月该天的
通过翻页可以返现这个时候页面的url地址是不变的,所以这里我们大致就可以判断出,中间表格的数据是通过js动态加载的,我们可以通过分析抓包,找到真实的请求地址
通过上图我们可以发现其实帧数的数据来源是http://www.hshfy.sh.cn/shfy/gweb/ktgg_search_content.jsp
当直接访问这个地址可以看到如下数据:
也正好验证了我们前面所说的,中间表格的数据是通过js动态加载的,所以我们剩下的就是对这个地址进行分析
分析真实地址
通过上图我们可以分析几个对我们有用的数据就是请求地址以及请求参数,
请求参数中,最重要的是日期以及页数
通过代码实现数据的爬取
import requests from bs4 import BeautifulSoup import json import time import datetime from config import * ''' 遇到python不懂的问题,可以加Python学习交流群:1004391443一起学习交流,群文件还有零基础入门的学习资料 ''' def get_html(url,data): ''' :param url:请求的url地址 :param data: 请求的参数 :return: 返回网页的源码html ''' response = requests.get(url,data) return response.text def parse_html(html): ''' :param html: 传入html源码 :return: 通过yield生成一个生成器,存储爬取的每行信息 ''' soup = BeautifulSoup(html, 'lxml') table = soup.find("table", attrs={"id": "report"}) trs = table.find("tr").find_next_siblings() for tr in trs: tds = tr.find_all("td") yield [ tds[0].text.strip(), tds[1].text.strip(), tds[2].text.strip(), tds[3].text.strip(), tds[4].text.strip(), tds[5].text.strip(), tds[6].text.strip(), tds[7].text.strip(), tds[8].text.strip(), ] def write_to_file(content): ''' :param content:要写入文件的内容 ''' with open("result.txt",'a',encoding="utf-8") as f: f.write(json.dumps(content,ensure_ascii=False)+"\n") def get_page_nums(): ''' :return:返回的是需要爬取的总页数 ''' base_url = "http://www.hshfy.sh.cn/shfy/gweb/ktgg_search_content.jsp?" date_time = datetime.date.fromtimestamp(time.time()) data = { "pktrqks": date_time, "ktrqjs": date_time, } while True: html = get_html(base_url,data) soup = BeautifulSoup(html, 'lxml') if soup.body.text.strip() == "系统繁忙": print("系统繁忙,登录太频繁,ip被封锁") time.sleep(ERROR_SLEEP_TIME) continue else: break res = soup.find("div",attrs={"class":"meneame"}) page_nums = res.find('strong').text #这里获得page_nums是一个爬取的总条数,每页是15条数据,通过下面方法获取总页数 page_nums = int(page_nums) if page_nums %15 == 0: page_nums = page_nums//15 else: page_nums = page_nums//15 + 1 print("总页数:",page_nums) return page_nums def main(): ''' 这里是一个死循环爬取数据 ''' page_nums = get_page_nums() if not True: return base_url = "http://www.hshfy.sh.cn/shfy/gweb/ktgg_search_content.jsp?" while True: date_time = datetime.date.fromtimestamp(time.time()) page_num = 1 data = { "pktrqks": date_time, "ktrqjs": date_time, "pagesnum":page_num } while page_num <= page_nums: print(data) while True: html = get_html(base_url, data) soup = BeautifulSoup(html, 'lxml') if soup.body.text.strip() == "系统繁忙": print("系统繁忙,登录太频繁,ip被封锁") time.sleep(ERROR_SLEEP_TIME) continue else: break res = parse_html(html) for i in res: write_to_file(i) print("爬取完第【%s】页,总共【%s】页" %(page_num,page_nums)) page_num+=1 data["pagesnum"] = page_num time.sleep(1) else: print("爬取完毕") print("开始休眠.......") time.sleep(SLEEP_TIME) if __name__ == '__main__': main()
文章来源: https://blog.csdn.net/qq_40925239/article/details/90516984