1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
| """ Created on 2024-03-26 17:27:27 --------- @summary: --------- @author: zhangmingwei01 """
import feapder from feapder import ArgumentParser from items.spider_data_item import SpiderDataItem
class SpiderTest(feapder.TaskSpider): # 自定义数据库,若项目中有setting.py文件,此自定义可删除 __custom_setting__ = dict( REDISDB_IP_PORTS="localhost:6379", REDISDB_USER_PASS="", REDISDB_DB=0, MYSQL_IP="localhost", MYSQL_PORT=3306, MYSQL_DB="data", MYSQL_USER_NAME="root", MYSQL_USER_PASS="pwd", )
def add_task(self): # 加种子任务 框架会调用这个函数,方便往redis里塞任务,但不能写成死循环。实际业务中可以自己写个脚本往redis里塞任务 self._redisdb.zadd(self._task_table, {"id": 1, "url": "https://www.baidu.com"})
def start_requests(self, task): task_id = task.id url = task.url yield feapder.Request(url, task_id=task_id)
def parse(self, request, response): # 提取网站title title = response.xpath("//title/text()").extract_first() print("网站标题:", title) # 提取网站描述 print(response.xpath("//meta[@name='description']/@content").extract_first()) print("网站地址: ", response.url) item = SpiderDataItem(**{ "title": title, "url": response.url, }) yield item
# mysql 需要更新任务状态为做完 即 state=1 # yield self.update_task_batch(request.task_id)
if __name__ == "__main__": # 用mysql做任务表,需要先建好任务任务表 # spider = SpiderTest( # redis_key="spider:test", # 分布式爬虫调度信息存储位置 # task_table="spider_test", # mysql中的任务表 # task_keys=["id", "url"], # 需要获取任务表里的字段名,可添加多个 # task_state="state", # mysql中任务状态字段 # )
# 用redis做任务表 spider = SpiderTest( redis_key="spider:test2024", # 分布式爬虫调度信息存储位置 task_table="spider_test", # 任务表名 task_table_type="redis", # 任务表类型为redis )
parser = ArgumentParser(description="SpiderTest爬虫")
parser.add_argument( "--start_master", action="store_true", help="添加任务", function=spider.start_monitor_task, ) parser.add_argument( "--start_worker", action="store_true", help="启动爬虫", function=spider.start )
parser.start()
# 直接启动 spider.start() # 启动爬虫 spider.start_monitor_task() # 添加任务
# 通过命令行启动 # python spider_test.py --start_master # 添加任务 # python spider_test.py --start_worker # 启动爬虫
|