爬虫项目练习

利用scrapy框架创建一个项目爬取职友集最具人气公司的岗位招聘信息

1.创建一个scrapy项目,

2.定义items.py文件Item类进行数据存储(以便后续通过引擎传递给Pipeline)

3.在spider目录下创建spider文件

4.修改settings.py文件

5.运行scrapy爬虫

想要运行Scrapy有两种方法,一种是在本地电脑的终端跳转到scrapy项目的文件夹(跳转方法:cd+文件夹名),然后输入命令行:scrapy crawl jobui(jobui就是我们爬虫的名字)

另一种运行方式需要我们在最外层的大文件夹里新建一个main.py文件(与scrapy.cfg同级)。我们只需要在这个main.py文件里,输入以下代码,点击运行,Scrapy的程序就会启动。

爬虫项目练习

 

爬虫项目练习

import scrapy
from bs4 import BeautifulSoup
from ..items import JobuiItem

class JobuiSpider(scrapy.Spider):
    name='jobui'
    allowed_domains=['www.jobui.com']
    start_urls=['https://www.jobui.com/rank/company/']
    def parse(self, response):
        bs=BeautifulSoup(response.text,'html.parser')
        ur_list=bs.find_all('ul',class_="textList flsty cfix")
        for ur in ur_list:
            a_list=ur.find_all('a')
            for a in a_list:
                company_id=a['href']
                url = 'https://www.jobui.com{id}jobs'.format(id=company_id)
                yield scrapy.Request(url,callback=self.parse_job)
#scrapy.Request是构造requests对象的类
#callback回调。self.parse_job是我们新定义的parse_job方法。
#往requests对象里传入callback=self.parse_job这个参数后,引擎就能知道response要前往的下一站,是parse_job()方法。
    def parse_job(self,response):
        bs = BeautifulSoup(response.text, 'html.parser')
        company = bs.find(id="companyH1").text
        datas = bs.find_all('div',class_="c-job-list")
        for data in datas:
            item=JobuiItem()
            item['company']=company
            item['position']=data.find('a').find('h3').text
            item['address'] = data.find_all('span')[0]['title']
            item['detail'] = data.find_all('span')[1].text
            yield item

爬虫项目练习

另外再增添以下语句,实现本地存储为csv文件

FEED_URI='./storage/data/%(name)s.csv'

FEED_FORMAT='csv'

FEED_EXPORT_ENCODING='ansi'

 2.通过gevent多协程实现异步爬取薄荷网食物热量信息

#通过多协程和queue模块实现请求异步进行,提高效率 爬取薄荷网食物热量信息
from gevent import monkey
monkey.patch_all()
from gevent.queue import Queue
import gevent,csv,requests
from bs4 import BeautifulSoup
work=Queue()
for i in range(1,11):
    for j in range(1,3):
        url='http://www.boohee.com/food/group/'+str(i)+'?page='+str(j) #每类食物爬取2页
        work.put_nowait(url) 
        
for i in range(1,3):
    url='http://www.boohee.com/food/view_menu/?page='+str(i)
    work.put_nowait(url)
    
def crawler():
    while not work.empty():
        url=work.get_nowait()
        r=requests.get(url)
        bs=BeautifulSoup(r.text,'html.parser')
        for tag in bs.find_all('li',class_="item clearfix"):
            food_url='http://www.boohee.com'+tag.find('a')['href']
            food_name=tag.find('h4').find('a')['title']
            food_energy=tag.find('p').text
            with open('food.csv','a', newline='') as file:
                writer=csv.writer(file)
                writer.writerow([food_name,food_energy,food_url])
task_list=[]
for i in range(3):
    task=gevent.spawn(crawler)
    task_list.append(task)
gevent.joinall(task_list)

上一篇:scrapy-redis性能问题


下一篇:Gerapy的实现可视化的爬虫管理