クローラー学習記録

文字列を辞書に変換する方法:

# 字典推导式
cookies="anonymid=j3jxk555-nrn0wh; _r01_=1; _ga=GA1.2.1274811859.1497951251; _de=BF09EE3A28DED52E6B65F6A4705D973F1383380866D39FF5; [email protected]; depovince=BJ; jebecookies=54f5d0fd-9299-4bb4-801c-eefa4fd3012b|||||; JSESSIONID=abcI6TfWH4N4t_aWJnvdw; ick_login=4be198ce-1f9c-4eab-971d-48abfda70a50; p=0cbee3304bce1ede82a56e901916d0949; first_login_flag=1; ln_hurl=http://hdn.xnimg.cn/photos/hdn421/20171230/1635/main_JQzq_ae7b0000a8791986.jpg; t=79bdd322e760beae79c0b511b8c92a6b9; societyguester=79bdd322e760beae79c0b511b8c92a6b9; id=327550029; xnsid=2ac9a5d8; loginfrom=syshome; ch_id=10016; wp_fold=0"
cookies = {
    
    i.split("=")[0]:i.split("=")[1] for i in cookies.split("; ")}
#字典是无序的

# 列表推导式
self.url_temp = "https://tieba.baidu.com/f?kw=" + tieba_name + "&ie=utf-8&pn={}"
return [self.url_temp.format(i * 50) for i in range(1000)]

使用法を要求する:

tips:response.text 对象中,名词一般是属性,动词一般是方法,需要加括号

byte型数据(字符串前面加b'的),解码时用decode:
例:b'<!DOCTYPE html>\.... </html>\r\n'
response.content.decode()

# requests中解决编解码的方法
response.content.decode()
response.content.decode("gbk")
response.text

import json
json.loads(response.content.decode())

データ抽出方法

jsonデータ抽出

  • jsonの文字列はすべて二重引用符で囲まれています
    • 二重引用符でない場合
      • eval:単純な文字列とPythonの型変換を実現できます
      • 置換:一重引用符を二重引用符に置き換えます

json.loads()和json.dump()

html_str = parse_url(url)
# json.loads把json字符串转化为python类型(字典)
ret1 = json.loads(html_str)

# json.dumps能够把python类型转化为json字符串
# ensure_ascii=False设置编码, indent=4设置换行缩进,都是为了使数据看起来更美观
# encoding="utf-8" 也是必要的
with open("douban.json","w",encoding="utf-8") as f:
    f.write(json.dumps(ret1, ensure_ascii=False, indent=4))

正規表現

常用正则表达式的方法:
	re.compile(编译)
	pattern.match(从头找一个)
	pattern.search(找一个)
	pattern.findall(找所有)
	pattern.sub(替换)

ここに画像の説明を挿入

注意点を使用する:

  • re.findall("a(*?)b","str")、角かっこ内のコンテンツを返すことができます。角かっこの前後のコンテンツは、配置とフィルタリングの役割を果たします。
  • 元の文字列r、一致する文字列にバックスラッシュがある場合、rを使用すると、バックスラッシュによってもたらされるエスケープ効果を無視できます。
  • デフォルトではドットは一致しません\ n
  • \sスペースだけでなく、空白の文字列も照合できます\t \r \n

Xpath学習

ここに画像の説明を挿入
ここに画像の説明を挿入

  • xpathヘルパーを使用するかChromeでxpathをコピーすることは要素から抽出されたデータですが、クローラーはURLに対応する応答を取得します。これは多くの場合要素とは異なります。
  • テキストを取得する
    • a/text() 下のテキストを取得します
    • a//text() 下のすべてのタグに含まれるテキストを取得します
    • //a[text()='下一页'] テキストに基づいて選択
  • 属性を取得する@符号
    • / html / head / link /
    • //ul[@id="detail-list"]
  • //
    • xpathの先頭では、現在のhtmlの任意の位置から選択することを意味します
    • li//aliの下のラベルを示します(/を使用する場合は、1つのレベルと1つのレベルを選択する必要がありますが、これはより複雑です)
示例:
//ul[@id="detail-list"]/li/a[@class='image share-url']/@href
# /@href 用于获取标签中的网页链接

コードでxpathを使用する

lxmlライブラリを使用する必要があります

  • 入門:
    • lxmlからetreeライブラリの
      lxmlをインポートしますimportetree
    • etree.HTMLを使用して、文字列をElementオブジェクトに変換します
    • 要素オブジェクトにはxpathメソッドがあります
      html = etree.HTML(text)
from lxml import etree
text = ''' <div> <ul> 
        <li class="item-1"><a>first item</a></li> 
        <li class="item-1"><a href="link2.html">second item</a></li> 
        <li class="item-inactive"><a href="link3.html">third item</a></li> 
        <li class="item-1"><a href="link4.html">fourth item</a></li> 
        <li class="item-0"><a href="link5.html">fifth item</a>  
        </ul> </div> '''

html = etree.HTML(text)
print(html)
#查看element对象中包含的字符串
print(etree.tostring(html).decode())

#获取class为item-1 li下的a的herf
ret1 = html.xpath("//li[@class='item-1']/a/@href")

#获取class为item-1 li下的a的文本
ret2 = html.xpath("//li[@class='item-1']/a/text()")

#分组,根据li标签进行分组,对每一组继续写xpath
ret3 = html.xpath("//li[@class='item-1']")
print(ret3)
for i in ret3:
    item=  {
    
    }
    item["title"] = i.xpath("./a/text()")[0] if len(i.xpath("./a/text()"))>0 else None
    item["href"] = i.xpath("./a/@href")[0] if len( i.xpath("./a/@href"))>0 else None
    print(item)

Scrapy

基本コンセプト

  • 非同期と非ブロッキングの違い
    ここに画像の説明を挿入
    异步:呼び出しが発行された後、呼び出しは結果に関係なく直接戻ります[同步异步是过程]
    非阻塞呼び出しの結果(メッセージ、戻り値)を待っている間、プログラムの状態に焦点が当てられます。これは、結果がすぐに取得できない前に、呼び出しが現在のスレッドをブロックしないことを意味します。[阻塞非阻塞是状态,拿到返回值前的状态,就是不用一直等,可以做其他事情]

Scrapyプロセス

ここに画像の説明を挿入

Scrapyを使い始める

  1. かすれたプロジェクトを作成する
scrapy startproject [项目名]
  1. クローラーをスポーンします
# 需要先进入项目文件下
cd myproject
scrapy genspider [爬虫名] [域名]

# 运行爬虫
scrapy scrawl itcast
  1. データの抽出、
    完全なスパイダー、xpathおよびその他の方法の使用
  2. データ
    パイプラインにデータを保存する

おすすめ

転載: blog.csdn.net/Saker__/article/details/107913622