利用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)