当前位置: 首页 > 后端技术 > Python

浅谈http爬虫

时间:2023-03-25 21:58:52 Python

因为兴趣写了一个小爬虫,说说爬虫的一些简单操作。1.第一步确定要抓取的url,是界面好还是html文本,要获取其他数据,先通过抓包工具确定要抓取的url地址2.使用Python构造请求,然后开始抓取数据,针对互联网上的站点、接口等,模拟人的操作构造响应请求,设置相应的请求头,获取想要的数据。3.对于第二步爬取的数据,清洗爬取的数据,解析界面,解析xml文本,html文本数据,找到想要的数据,清洗无关数据,也是构建结构化数据。常用于提取文本内容,如xpath和正则表达式。也可以再次深度爬取,进行第一步操作4.数据持久化(数据保存在本地,[文件,数据库])第三步爬取到想要的数据,可以将结构化数据持久化存储.文件或数据库可能跑题:然后是爬虫异常、分布式爬虫、反爬虫异常:一般来说,异常是反爬导致的,对方站点更新了反爬技术。分布式爬虫:多台机器同时爬取同一个站点的数据,快速爬取站点数据反爬:处理站点的一些反爬技术:验证码、ip、代码混淆等。网络爬虫:网络爬虫网络爬虫模拟人类使用浏览器浏览和操作页面的行为,对互联网站点进行操作。网络爬虫获取一个页面后,会解析页面中的所有URI,并沿着这些URI路径递归遍历所有页面,因此被称为爬虫(Webcrawler)、蜘蛛(Spider)、网络机器人(spiderbot)。步骤:确定要爬取的url:https://search.sina.com.cn/?q=%E6%98%A5%E8%8A%82&range=all&c=news&sort=timecrawlurlpythonconstructrequestdef__send_page_req(self,page_num:int=1):"""发起请求:return:"""search_url=self.__init_search_url(page_num)response=requests.get(search_url)response=Selector(response=response)returnresponsedef__init_search_url(self,page:int=1):"""构造请求数据:parampage::return:"""params={'q':self.search_keyword,'range':"all",'c':'news','sort':"time",'page':page}str_params=urllib.parse.urlencode(params)returnself.search_url+'?'+str_params数据清理defparse_page_req(self,page_num:int=1):pass完整代码:(根据关键词抓取所有2020-12-01之后的新浪新闻数据)importrequestsfromscrapy.selectorimportSelectorimporturllib.parseimportdatetimeimportreclassSinaNewsSpider:"""新浪新闻搜索"""search_url='https://search.sina.com.cn/?{params}'spider_source='sina'title_compile=re.compile('([\s\S]*?)')article_min_date='2020-12-0100:00:00'#新闻的最早时间def__init__(self,search_keyword:str):self.search_keyword=search_keyworddefgo(self):page_num=1whileTrue:news_data,min_date=self.parse_page_req(page_num)[self.__save(item)foriteminself.parse_data(news_data)]ifmin_date>self.article_min_date:page_num+=1else:breakdef__save(self,data):"""数据存储:paramdata::return:"""print(data)passdefparse_data(self,news_data):"""数据解析:paramnews_data::return:"""fornewsinnews_data:content=self.__get_content(news['detail_url'])ifcontentisNone:print('error:',news)else:item={}item['content']=contentitem['source']='sina'item['keyword']=self.search_keyworditem['news_url']=news['detail_url']item['insert_time']=str(datetime.datetime.today())item['title']=news['title']item['release_time']=news['release_time']item['author']=news['author']yielditemdef__get_content(self,url):response=requests.get(url)response=Selector(text=response.content.decode('utf-8'))content=response.xpath('//div[@id="article"]').extract_first()内容_artibody=response.xpath('//div[@id="artibody"]').extract_first()content_section=response.xpath('//section[@class="art_pic_cardart_content"]').extract_first()返回content或content_artibody或content_sectiondefparse_page_req(self,page_num:int=1):"""解析翻页请求:paramresponse::return:"""response=self.__send_page_req(page_num)news_list=response.xpath('//div[@id="result"]/div[@class="box-resultclearfix"]')news_data=[]fornewsinnews_list:item={}title=news.xpath(".//h2/a").extract_first()item['title']=self.title_compile.findall(title)[0]item['detail_url']=news.xpath(".//h2/a/@href").extract_first()source_time_str=news.xpath(".//h2/span/text()").extract_first().strip()item['作者'],item['release_time']=source_time_str.split("",maxsplit=1)news_data.append(item)returnnews_data,min(map(lambdax:item['release_time'],news_data))def__send_page_req(self,page_num:int=1):"""发起请求:return:"""search_url=self.__init_search_url(page_num)response=requests.get(search_url)response=Selector(response=response)returnresponsedef__init_search_url(self,page:int=1):"""构造请求数据:parampage::return:"""params={'q':self.search_keyword,'range':"all",'c':'news','sort':"time",'page':page}str_params=urllib.parse.urlencode(params)returnself.search_url.format(params=str_params)sina=SinaNewsSpider("春节")news_data=sina.go()python还是很不错的工具