написать впереди
В последнее время я изучаю синтаксис Python, чищу LeetCode или что-то в этом роде. Познакомившись с ним, я захотел написать краулер и реально его использовать.
Как начать работу с поисковым роботом Python? - ответ Койя Лян - знаю
Чжиху на некоторое время, а потом читатьscrapyи начните.
Так что лезть❓
В то время я думал о написании паука, который загружает файлы хранилища github по каталогу. Потому что при загрузке репозитория github в прошлом вы могли только клонировать весь репозиторий на основе адреса git или вы могли загрузить только один файл через octoTree или Insightio.Однако часто бывают случаи, когда вам нужно загрузить один или несколько каталогов, поэтому я подумал о написании каталога на основе загрузки сканера файлов на github.
Начинать
Для начала конечно же рекомендуется посмотреть официальнуюРуководство по началу работы.
Вот краткое описание шагов:
##1.创建项目
scrapy startproject scrapy_github_dir
##2.创建爬虫
scrapy genspider app github.com
##3.写逻辑或者进行设置等等
##4.运行爬虫,爬取路径是github上的目录或者文件
scrapy crawl app -a urls = https://github.com/ditclear/BindingListAdapter/tree/917e254f527d101e3f583c38739a61f3bcffbc11/library-kotlin
Основной кодapp.py, при бегеscrapy genspider app github.com
автоматически сгенерирует его для вас
import scrapy
from ..items import ScrapyGithubDirItem
class AppSpider(scrapy.Spider):
name = 'app'
allowed_domains = ['github.com']
content_domains = 'https://github.com/'
start_urls = []
def __init__(self, urls=None, *args, **kwargs):
super(AppSpider, self).__init__(*args, **kwargs)
self.start_urls = urls.split(',')
//运行scrapy crawl xx 后,处理response
def parse(self, response):
raw_url = response.css('a#raw-url').xpath('@href').extract_first()
if raw_url:
href = self.content_domains+raw_url
print("scrapy from href --> ", href)
yield scrapy.Request(href, callback=self.parse_link)
else:
for link in response.selector.xpath('//a[@class="js-navigation-open"]/@href').extract()[1:]:
href = self.content_domains+link
yield scrapy.Request(href, callback=self.parse)
def parse_link(self, response):
responseStr = str(response).strip()
url = responseStr.strip()[5:len(responseStr)-1]
print('download from url --> ', url)
item = ScrapyGithubDirItem()
item['file_urls'] = [url]
return item
при бегеscrapy crawl xx
позже будет вparse(self, response)
метод обрабатывает ответ.
При работе с ответом простое понимание состоит в том, чтобы найти нужный контент с помощью селекторов css и xpath, таких как text/img/href и т. д. После получения желаемого контента сохраните его в файл или базу данных, с небольшим количеством смешанных в нем Конфигурация.
Через анализ исходных файлов веб-страницы:
Вы можете видеть, что ссылка на скачивание одного файла находится в теге a с идентификатором raw-url, поэтому нам нужно найти этот тег и получить нужную ссылку.
raw_url = response.css('a#raw-url').xpath('@href').extract()
Смысл здесь в том, чтобы найти тег a с идентификатором raw-url с помощью селектора CSS, затем получить параметр href тега a и, наконец, извлечь его и вернуть в виде списка.
Если он не возвращается, значит, URL текущего запроса — это не конкретный файл, а каталог.
если текущий URL-адрес является каталогом
Проанализируйте структуру ответа каталога и продолжайте поиск файла следующего уровня через селектор css и xpath.
Точно так же найти этот адрес
response.selector.xpath('//a[@class="js-navigation-open"]/@href').extract()
Следует отметить, что в возвращаемом списке значение первого индекса указывает на предыдущий каталог, поэтому его необходимо исключить. Затем рекурсивно вызывайте текущий метод синтаксического анализа, пока файл не будет просканирован.
if raw_url:
//爬取具体的文件
yield scrapy.Request(href, callback=self.parse_link)
else:
//如果是目录,递归直到爬取到文件为止
for link in response.selector.xpath('//a[@class="js-navigation-open"]/@href').extract()[1:]:
yield scrapy.Request(href, callback=self.parse)
Кода не так много, и если он пойдет хорошо, он будет успешным через полдня.
напиши в конце
Оглядываясь назад, я вижу, что она была написана без лишнего. Краулер вроде бы просто находит нужные данные через css селекторы, xpath или регулярность, а потом выполняет нужную обработку, смешанную с рекурсивной логикой и алгоритмами.Конечно, это только первый скрейпинг, но Python и скрэпи уже можно найти. сильный.
адрес гитхаба:GitHub.com/map-clear/generate…