一、新建一个Scrapy项目wangyi,进入该项目,创建wangyipc文件
scrapy startproject wangyi cd wangyi scrapy genspider wangyipc www.xxx.com
二、修改settings文件
ROBOTSTXT_OBEY = False LOG_LEVEL = 'ERROR' USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36"
三、获取这四个板块的响应内容
start_urls = ["https://XXXX.com/"] 板块链接=[] def parse(self, response): 板块下标=[1,2,4,5] 板块列表=response.xpath('//*[@id="index2016_wrap"]/div[3]/div[2]/div[2]/div[2]/div/ul/li') for i in 板块下标: 板块链接=板块列表[i].xpath('./a/@href').extract_first() 板块名字=板块列表[i].xpath('./a/text()').extract_first() self.板块链接.append(板块链接) print(板块名字,板块链接)
运行结果:
国内 https://news.163.com/domestic/ 国际 https://news.163.com/world/ 军事 https://war.163.com/ 航空 https://news.163.com/air/
四、由于新闻的详细信息是动态加载,所以我们需要结合selenium来进行操作
1、导入浏览器驱动
2、在爬虫文件创建浏览器对象
from selenium import webdriver 浏览器对象=webdriver.Chrome(executable_path='../../chromedriver.exe')
3、通过中间操作
def process_response(self, request, response, spider): 板块链接=spider.板块链接 if request.url in 板块链接: 浏览器对象=spider.浏览器对象 浏览器对象.get(request.url) sleep(1) 网页内容=浏览器对象.page_source response=HtmlResponse(url=request.url,request=request,encoding='utf8',body=网页内容) return response else: return response
4、开启中间件
DOWNLOADER_MIDDLEWARES = { "wangyi.middlewares.WangyiDownloaderMiddleware": 543, }
5、爬虫文件完成最后解析
for u in self.板块链接: yield scrapy.Request(url=u,callback=self.详情页解析) def 详情页解析(self,response): 新闻列表=response.xpath('/html/body/div[1]/div[3]/div[3]/div[1]/div[1]/div/ul/li/div/div') for i in 新闻列表: try: 标题=i.xpath('./div/div[1]/h3/a/text()').extract_first() 详情页 = i.xpath('./div/div[1]/h3/a/@href').extract_first() item对象=WangyiItem() item对象['标题']=标题 #print(标题, 详情页) except Exception as e: print("爬虫问题") if 详情页!=None: yield scrapy.Request(url=详情页,callback=self.新闻内容,meta={'item':item对象}) def 新闻内容(self,response): item=response.meta['item'] 内容=response.xpath('//*[@id="content"]/div[2]//text()').extract() 内容=''.join(内容).strip() item['内容']=内容 yield item
6、items添加对象
标题 = scrapy.Field() 内容 = scrapy.Field()
7、管道文件操作
class WangyiPipeline: def process_item(self, item, spider): print(item) return item
8、开启管道
ITEM_PIPELINES = { "wangyi.pipelines.WangyiPipeline": 300, }
9、关闭浏览器对象
def closed(self, reason): self.浏览器对象.quit()
10、运行
scrapy crawl wangyipc
11、部分截图