两个命令:
pip install scrapyd
pip install scrapyd-client
服务端:scrapyd
客户端 scrapyd-client
如何理解服务端和客户端?
服务端运行了爬虫程序后,客户端也要开启然后对服务端进行连接。
启动服务端:
当看到以下页面即成功!:
开启cfg:
部署: 部署成功
部署命令:(部署命令如何情况下使用?当scrapyd运行服务器的时候,要通过部署命令将已有的爬虫部署到服务器上,通过调用curl http://localhost:6800/schedule.json -d project=myspider -d spider=lianjia如此爬虫的功能才能使用。如果不部署,那么只能使用 scrapy crawl 爬虫名 来调用)
scrapyd-deploy mys -p myspider
部署成功后,项目目录中多了一些文件:
启动爬虫
客户端,启动爬虫:(项目名:myspider, 爬虫名:lianjia)
curl http://localhost:6800/schedule.json -d project=myspider -d spider=lianjia
于是,在服务端就有了记录:
此时多了一条记录:
备注:
如果没有出现刚才的Jobs中的日志,就查看scrapyd 中的报错信息进行纠正即可。
关闭爬虫:
也是发送POST请求
实际操作:
调用接口:
scrapyd 提示完成:
结果展示和 本地运行的 scrapy crawl lianjia 的效果是一样的, 也是会弹出一个chrome浏览器。
我的爬虫代码:
import scrapy
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
import time
import json
import os
class LianjiaSpider(scrapy.Spider):
name = "lianjia"
allowed_domains = ["lianjia.com"]
start_urls = ["https://sh.lianjia.com/ershoufang/sq5968/?sug=小区名字"]
def __init__(self, *args, **kwargs):
super(LianjiaSpider, self).__init__(*args, **kwargs)
chrome_options = Options()
chrome_options.add_argument("--start-maximized") # 启动最大化
chrome_options.add_argument("--disable-extensions") # 禁用扩展程序
chrome_options.add_argument("--disable-gpu") # 禁用GPU加速
driver_path = r'D:\software\chromedriver\chromedriver127\chromedriver-win64\chromedriver.exe' # 确保chromedriver在环境变量中
service = Service(executable_path=driver_path)
self.driver = webdriver.Chrome(service=service, options=chrome_options)
def parse(self, response):
self.driver.get(response.url)
page_source = self.driver.page_source
response = scrapy.Selector(text=page_source)
# 解析数据
listings = []
for li in response.css('ul.sellListContent li.clear'):
img = li.css('a img.lj-lazy::attr(src)').get()
title = li.css('div.title a::text').get()
detail_url = li.css('div.title a::attr(href)').get()
community = li.css('div.flood a[data-el="region"]::text').get()
area = li.css('div.address div.houseInfo::text').get()
follow_info = li.css('div.followInfo::text').get()
tag = li.css('div.tag span::text').getall()
total_price = li.css('div.priceInfo div.totalPrice span::text').get()
unit_price = li.css('div.priceInfo div.unitPrice span::text').get()
listings.append({
'img': img,
'title': title,
'detail_url': detail_url,
'community': community,
'area': area,
'follow_info': follow_info,
'tag': tag,
'total_price': total_price,
'unit_price': unit_price,
})
# 保存数据到JSON文件
output_file = os.path.join(os.getcwd(), 'lianjia_listings.json')
with open(output_file, 'w', encoding='utf-8') as f:
json.dump(listings, f, ensure_ascii=False, indent=4)
self.log(f'Saved file {output_file}')
# 等待20秒
time.sleep(20)
# 关闭浏览器
self.driver.quit()
特别注意: