爬虫入门

爬虫入门

一.re(正则匹配)
# findall: 匹配字符串中符合正则的内容
lst = re.findall(r"\d+" , "我的电话是123,我的朋友的电话是456123")
# # finditer: 匹配字符串中所有的内容[返回的是迭代器],从迭代器中拿到内容需要使用.group()
it = re.finditer(r"\d+" , "我的电话是123,我的朋友的电话是456123")
print(it)
for i in it:
    print(i.group())
#search,找到一个结果便返回返回的对象是match对象,拿数据要.group()
s = re.search(r"\d+" , "我的电话是123,我的朋友的电话是456123")
print(s.group())
# match 默认从头开始匹配
s = re.match(r"\d+" , "123,我的朋友的电话是456123")
print(s.group())
import re
s = '''
<div class='西游记'><span id='10010'>中国联通</span></div>
'''

#使用(?P<分组名字>正则),在用.group(分组名字)拿出内容
obj = re.compile(r"<div class='.*?'><span id='(?P<wq>\d+)'>(?P<wa>.*?)</span></div>",re.S)#让.能匹配换行符
str = obj.finditer(s) # 迭代器
for i in str:
    print(i.group("wa")) # 拿出分组内容
    print(i.group("wq"))
二.requests(请求)

三种情况:

  1. get请求

    import requests
    
    query = input("输入一个喜欢的明星")
    url = f'https://www.sogou.com/web?query={query}'
    header = {
        "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:101.0) Gecko/20100101 Firefox/101.0"
    }
    resp = requests.get(url,headers=header)#处理了一个小小的反爬,未有请求头时不能爬取到数据
    
    print(resp)
    print(resp.text)
    
  2. post请求

    #requests02.py
    import requests
    url = 'https://fanyi.baidu.com/sug'
    
    s = input("输入想翻译的单词")
    dat = {
        "kw" : s
    }
    # 发送post请求,发送的数据必须放在字典中,通过data参数进行传递
    resp = requests.post(url,data = dat,)
    
    print(resp.json()) #将服务器返回的数据转化成json数据类型=>dict
    
  3. 添加参数

    import requests
    
    url = "https://movie.douban.com/j/chart/top_list"
    
    #重新封装参数
    param = {
        "type": "24",
        "interval_id": "100:90",
        "action":"",
        "start": "0",
        "limit": "20"
    }
    header = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36"
    }
    resp = requests.get(url,params = param,headers = header)
    
    print(resp.text)
    resp.close()
    
三.bs4
from bs4 import BeautifulSoup
#bs4拿去源代码
main_page = BeautifulSoup(resp.text,"html.parser")
alist = main_page.find("ul",class_="pic-list after").find_all("a") #范围第一次缩小
#soup.find返回的是一个对象,第一个符合条件的标签 
#soup.findAll返回的是一个列表,包含所有符合条件的标签
#所以find后面可以直接接get_text函数,而findAll不行,只能将findAll列表中的元素,单独地去get_text
四.xpath
# xpath解析
from lxml import etree

xml = '''
<note>
<to>Tove</to>
<from>Jani</from>
<div>
<to>love</to>
</div>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

'''
#parser = etree.XMLParser(encoding = "utf-8")
tree = etree.XML(xml)#去拿xml的源码
# result = tree.xpath("/note") # 表示层级关系,第一个/是根节点
result = tree.xpath("/note//text()") # text() 拿文本 "//"表示那全部的后代
result = tree.xpath("/note/*/text()") # /*/任意的节点,通配符
print(result)

第二种:

tree = etree.HTML(resp)
ol_li_list = tree.xpath("/html/body/ol/li")

for li in ol_li_list:
    # 从每一个li中提取文字信息
    result = li.xpath("./a/text()") #  在li中继续寻找,相对路径
    print(result)
    result2 = li.xpath("./a/@href") # 通过@拿到属性的值
    print(result2)
posted @ 2022-09-08 11:38  不落微笑  阅读(37)  评论(0)    收藏  举报