scrapy crawler - 爬虫小记

2023-12-18 00:08
文章标签 scrapy 爬虫 小记 crawler

本文主要是介绍scrapy crawler - 爬虫小记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近熟悉了一波爬虫,挺有用的,推荐入门资料如下:

【视频资料】:

  1. Python Scrapy Tutorial - YouTube
  2. 2018年最新Python3.6网络爬虫实战
  3. 廖xf商业爬虫 (太多了,只能看小部分,不过确实很细)
  4. 当然如果不想写代码也是ok的,搜一搜八爪鱼,后羿采集器等类似app都挺方便好用的,可满足日常简单需求。

【书籍资料】:

  1. 还是推荐大神 崔庆才 的书

【学习总结】基本上可以熟练使用scrapy框架进行爬取,一般静态网页基本没有问题,简单的动态网页也ok(scrapy_splash, Selenium都ok)

  • 一般反爬的常规操作是构建一些动态的
    • headers  --> 就是伪装浏览器,
    • cookies池 --> 教学中买了很多weibo账号,进行操作,这个不是很熟,可以用自己多个账号登录后获得cookies,用random每次通过 中间件随机选择都ok
    • IP池, -->  可以购买,可以爬取公开的一些网站,xichi,站大爷,乃至github上一些免费ip_list (偷懒的话直接用scrapy-proxy-pool (https://github.com/hyan15/scrapy-proxy-pool)也行)等等  --->  如果要感觉高级一些可以加上定时爬取,获得有效ip后结合数据库操作进行存储,比如redis,postgres,MongoDB ...   
    • user-agent,-->  省事的话,不用去找,用前人写好的库就很棒 scrapy-user-agents
  • 会接触到一些提取网页结构,选择啥的,比如xpath, css 方法:CSS 选择器参考手册
  • 要熟悉设置 setting, pipeline, middlewares, items 等常用操作,得知道利用item将爬取数据进行保存
  • 基本的多页爬取,如何传递参数,或者response,如果保持登录,如何在scrapy中post请求(得留意一下Form中的动态id参数可能来自网页源代码,或者是js文件)等等

【假装有代码】:

# -*- coding: utf-8 -*-
import scrapy
from scrapy.http import FormRequest
from scrapy.utils.response import open_in_browser# from pachong.denglu.denglu.items import DengluItem
from ..items import DengluItemclass QuoteSpider(scrapy.Spider):name = 'quote'allowed_domains = ['quotes.toscrape.com']start_urls = ['http://quotes.toscrape.com/login']def parse(self, response):# open_in_browser(response)token = response.css('form input::attr(value)').extract_first()print(token)return FormRequest.from_response(response, formdata={"csrf_token":token,"username":'xxxx',"password":'xxxx'}, callback = self.parsing_2)def parsing_2(self, response):item = DengluItem()total = response.css('div.quote')# print('total = ', total)for quote in total:title = quote.css('span.text::text').extract()item['text'] = titleyield  item

【后续】:

总之还不是很熟,后面有机会边做边深入,基本爬虫这里暂时先告一段落。太晚了,为了头发,得休息了 (¦3[▓▓] 晚安

 

[10天后更新一波]

# -*- coding: utf-8 -*-
import json
import copyimport scrapyfrom ooko import create_catalog
from ..items import Temp2Item, CataItem, S_dict_Item
from bs4 import BeautifulSoupclass HttpbinSpider(scrapy.Spider):name = 'httpbin'# allowed_domains = ['drugs']# start_urls = ['http://drugs.medlive.cn/drugref/drugCate.do?treeCode=H0101']start_urls = ['http://drugs.medlive.cn/drugref/drugCate.do?treeCode=H0102']# start_urls = ['http://httpbin.org/get']# def make_requests_from_url(self, url):def start_requests(self):data = {XXXXXX}for b_name, b_value in data.items():if b_value:for s_name, s_url in b_value.items():s_item = S_dict_Item()s_item["s_name"] = s_names_item["s_url"] = s_urlprint("s_name = ", s_name)print("s_url = ", s_url)yield scrapy.Request(url=s_url, meta={'download_timeout': 2, "s_item": s_item}, callback=self.parse,dont_filter=True)# return scrapy.Request(url=url, meta={'download_timeout': 2}, callback=self.parse, dont_filter=True)def parse(self, response):s_item = response.meta["s_item"]cata_name = s_item["s_name"]print("cata_name = ", cata_name)# 创建目录cata = CataItem()# cata_name = "氨基糖苷类"url = response.urlpath = create_catalog(cata_name, url)cata["cata_name"] = cata_namecata["path"] = path + "/"print("path = ", cata["path"])Item = Temp2Item()one_name = response.css(".medince-name a::text").extract()one_link = response.css(".medince-name a::attr(href)").extract()print(one_name)print(one_link)for detail_url in one_link:detail_url_new = "http://drugs.medlive.cn/" + detail_urlprint('detail_url_new = ', detail_url_new)yield scrapy.Request(url=detail_url_new, callback=self.parse_detail, meta={'cata': cata})next_url = "http://drugs.medlive.cn/" + response.css('.other+ .grey a::attr(href)').extract_first()print("next_url = ", next_url)if next_url:yield scrapy.Request(url=next_url, callback=self.parse, meta={"s_item": s_item}, dont_filter=True)def parse_detail(self, response):print('------' * 20)print(response.url)print(response.status)save_path = response.meta['cata']['path']# print("save_path = ", save_path)soup = BeautifulSoup(response.text, "lxml")soup_1 = soup.prettify()title_name = response.css('.clearfix+ div p:nth-child(1)::text').extract_first()title_name = title_name.replace("\t", "")title_name = title_name.replace("\n", "")title_name = title_name.replace("\r", "")title_name = "".join(title_name.split())print(title_name)title = response.url.split('/')[-1]content = response.css('p::text').extract()path = save_pathwith open(path + title_name + "_" + title, 'w', encoding='utf-8') as f:# json.dump(content, f, ensure_ascii=False)json.dump(soup_1, f, ensure_ascii=False)
import random
def random_select():with open("xxx/proxy_txt", 'r') as f:data = f.readlines()ip_one = "http://" + random.choice(data).strip()return ip_onedef random_free_select():with open("xxxx/proxy_txt", 'r') as f:data = f.readlines()ip_one =random.choice(data).strip()return ip_oneclass PorxyMiddelware(object):logger = logging.getLogger(__name__)def process_request(self, request, spider):proxy_id = random_select()self.logger.debug("Using Proxy...{}".format(proxy_id))request.meta['proxy'] = proxy_iddef process_exception(self, request, exception, spider):self.logger.debug("Get Exception")proxy_id = random_select()request.meta['proxy'] = proxy_idreturn request
import scrapyclass Temp2Item(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()name = scrapy.Field()link = scrapy.Field()passclass CataItem(scrapy.Item):cata_name = scrapy.Field()path = scrapy.Field()class S_dict_Item(scrapy.Item):s_name = scrapy.Field()s_url = scrapy.Field()
DOWNLOADER_MIDDLEWARES = {'temp2.middlewares.PorxyMiddelware': 543,'scrapy.downloadermiddlewares.retry.RetryMiddleware': None,'scrapy_user_agents.middlewares.RandomUserAgentMiddleware': 400,
}

 

这篇关于scrapy crawler - 爬虫小记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/506354

相关文章

ZOJ Monthly, August 2014小记

最近太忙太忙,只能抽时间写几道简单题。不过我倒是明白要想水平提高不看题解是最好的了。 A  我只能死找规律了,无法证明 int a[50002][2] ;vector< vector<int> > gmax , gmin ;int main(){int n , i , j , k , cmax , cmin ;while(cin>>n){/* g

Codeforces Round #261 (Div. 2)小记

A  XX注意最后输出满足条件,我也不知道为什么写的这么长。 #define X first#define Y secondvector<pair<int , int> > a ;int can(pair<int , int> c){return -1000 <= c.X && c.X <= 1000&& -1000 <= c.Y && c.Y <= 1000 ;}int m

2014 Multi-University Training Contest 8小记

1002 计算几何 最大的速度才可能拥有无限的面积。 最大的速度的点 求凸包, 凸包上的点( 注意不是端点 ) 才拥有无限的面积 注意 :  凸包上如果有重点则不满足。 另外最大的速度为0也不行的。 int cmp(double x){if(fabs(x) < 1e-8) return 0 ;if(x > 0) return 1 ;return -1 ;}struct poin

2014 Multi-University Training Contest 7小记

1003   数学 , 先暴力再解方程。 在b进制下是个2 , 3 位数的 大概是10000进制以上 。这部分解方程 2-10000 直接暴力 typedef long long LL ;LL n ;int ok(int b){LL m = n ;int c ;while(m){c = m % b ;if(c == 3 || c == 4 || c == 5 ||

2014 Multi-University Training Contest 6小记

1003  贪心 对于111...10....000 这样的序列,  a 为1的个数,b为0的个数,易得当 x= a / (a + b) 时 f最小。 讲串分成若干段  1..10..0   ,  1..10..0 ,  要满足x非递减 。  对于 xi > xi+1  这样的合并 即可。 const int maxn = 100008 ;struct Node{int

Python3 BeautifulSoup爬虫 POJ自动提交

POJ 提交代码采用Base64加密方式 import http.cookiejarimport loggingimport urllib.parseimport urllib.requestimport base64from bs4 import BeautifulSoupfrom submitcode import SubmitCodeclass SubmitPoj():de

Python:豆瓣电影商业数据分析-爬取全数据【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】

**爬取豆瓣电影信息,分析近年电影行业的发展情况** 本文是完整的数据分析展现,代码有完整版,包含豆瓣电影爬取的具体方式【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】   最近MBA在学习《商业数据分析》,大实训作业给了数据要进行数据分析,所以先拿豆瓣电影练练手,网络上爬取豆瓣电影TOP250较多,但对于豆瓣电影全数据的爬取教程很少,所以我自己做一版。 目

Golang 网络爬虫框架gocolly/colly(五)

gcocolly+goquery可以非常好地抓取HTML页面中的数据,但碰到页面是由Javascript动态生成时,用goquery就显得捉襟见肘了。解决方法有很多种: 一,最笨拙但有效的方法是字符串处理,go语言string底层对应字节数组,复制任何长度的字符串的开销都很低廉,搜索性能比较高; 二,利用正则表达式,要提取的数据往往有明显的特征,所以正则表达式写起来比较简单,不必非常严谨; 三,使

Golang网络爬虫框架gocolly/colly(四)

爬虫靠演技,表演得越像浏览器,抓取数据越容易,这是我多年爬虫经验的感悟。回顾下个人的爬虫经历,共分三个阶段:第一阶段,09年左右开始接触爬虫,那时由于项目需要,要访问各大国际社交网站,Facebook,myspace,filcker,youtube等等,国际上叫得上名字的社交网站都爬过,大部分网站提供restful api,有些功能没有api,就只能用http抓包工具分析协议,自己爬;国内的优酷、

Golang网络爬虫框架gocolly/colly(三)

熟悉了《Golang 网络爬虫框架gocolly/colly 一》和《Golang 网络爬虫框架gocolly/colly 二》之后就可以在网络上爬取大部分数据了。本文接下来将爬取中证指数有限公司提供的行业市盈率。(http://www.csindex.com.cn/zh-CN/downloads/industry-price-earnings-ratio) 定义数据结构体: type Zhj