爬虫:你一定要知道的模板(附源码)

2023-11-13

爬虫:你一定要知道的模板(附源码)

作为一名cv程序员,梦想是造飞机,现实是拧螺丝

普通的爬虫,无非就是固定的模板

  1. xpath,bs定位标签
  2. axios返回数据,json解析
  3. selenium

json解析版

import requests
import codecs,csv
import time
import random


headers={
 #防盗链
 'referer':'https://www.douyin.com/user/MS4wLjABAAAA27xpsfnWLkcy9tQJszZ5kXKtqrVyqtn6lrFDRmE1kJZ8tUom93dXxUK0pplVJnwQ?modal_id=7200628769755876648',
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.63',
#有的网站需要带cookie才能返回数据
    'cookie':''
}

# ip池
ip_list = [

{'HTTP': '116.9.163.205:58080'},
{'HTTP': '61.216.185.88:60808'},
{'HTTP': '182.34.102.50:9999'},
{'HTTP': '183.236.232.160:8080'},
{'HTTP': '117.94.124.21:9000'},
{'HTTP': '210.5.10.87:53281'},
{'HTTP': '121.13.252.58:41564'},
{'HTTP': '121.13.252.60:41564'},
{'HTTP': '117.114.149.66:55443'},
{'HTTP': '112.14.47.6:52024'}
]
# 随机获取ip
# ip = ip_list.pop(random.randint(0, len(ip_list) - 1))
ip=random.choice(ip_list)

def getPlayUrl():
    for i in range(0,1000):
        
        try: 
            print('正在爬取'+str(i)+'页')
            #请求url,一般只需要拼接url,即可获取多页
            url = ''
            res=requests.get(url,headers=headers,proxies=ip)
            # print(res.text)
            print(res)
            #json格式,直接提取
            data=res.json()['comments']
            # print(data)
            for item in data:
                comments={}
                comments['cid']=item['cid']
                create_time=item['create_time']
                comments['time']=time.strftime("%Y-%m-%d %H:%M",time.localtime(create_time))
                
                # comments['user']=item['user']['nickname']
                comments['comment']=item['text']
                yield comments
            time.sleep(1)
        except Exception as e:
            print(e)
            break

if __name__=='__main__':
	#保存数据
    f=codecs.open('抖音评论_1.csv','a+',encoding='utf-8-sig')
    filename=['cid','time','comment']
    writer=csv.DictWriter(f,filename)
    writer.writeheader()
    for i in getPlayUrl():
        print(i)
        writer.writerow(i)

    # getPlayUrl()

元素定位

BeautifulSoup

from bs4 import BeautifulSoup
import requests
import time
import codecs,csv

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
}

f=codecs.open('歌单_1.csv','w+', encoding='utf-8-sig')
filename=['歌单详情页地址','歌单标题','歌单播放量','歌单贡献者名字']
writer=csv.DictWriter(f,filename)
writer.writeheader()
j=0
for i in range(0, 656, 35):
    time.sleep(2)
    print('正在爬取'+str(j)+'页')
    
    url = 'https://music.163.com/discover/playlist/?&order=hot&limit=35&offset=' + str(i)
    response = requests.get(url=url, headers=headers)
    html = response.text
    soup = BeautifulSoup(html, 'html.parser')
    # 获取包含歌单详情页网址的标签
    ids = soup.select('.dec a')
    # 获取包含歌单索引页信息的标签
    lis = soup.select('#m-pl-container li')
    print(len(lis))

   

    for j in range(len(lis)):
        # 获取歌单详情页地址
        url = 'https://music.163.com'+ids[j]['href']
        # 获取歌单标题
        title = ids[j]['title']
        # 获取歌单播放量
        play = lis[j].select('.nb')[0].get_text()
        # 获取歌单贡献者名字
        user = lis[j].select('p')[1].select('a')[0].get_text()
        # 输出歌单索引页信息
        obj={'歌单详情页地址':url,'歌单标题':title,'歌单播放量':play,'歌单贡献者名字':user}
        print(obj)
        # 将信息写入CSV文件中
        writer.writerow(obj)

    j+=1

xpath

import requests
from lxml import etree
import json
import re
import pprint
import codecs,csv
import time
import random

headers={
    'referer':'https://www.mafengwo.cn/mdd/citylist/10183.html',
    'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.44',
    'cookie':''
}
def getSpot():
    for i in range(0,16):
        try:
            print('爬取第' + str(i) + '页……')
            url='https://www.mafengwo.cn/mdd/base/list/pagedata_citylist'
            data={
                'mddid': '10183',
                'page': i
            }
            res=requests.post(url=url,headers=headers,data=data,proxies=ip)
            # print(res)
            # print(res.text)
            data=json.loads(res.text)
            text=data['list']
            html=etree.HTML(text)
            total=html.xpath("//li[@class='item ']")
            for item in total:
                info={}
                info['地址']=item.xpath(".//div[@class='title']/text()")[0]
                info['累计游玩人数']=item.xpath(".//div[@class='nums']/b/text()")[0]
                info['url']='https://www.mafengwo.cn/'+item.xpath('.//a/@href')[0]
                yield info
            time.sleep(2)
        except Exception as e:
            print(e)
            break

        

if __name__=="__main__":

    # ip池
    ip_list = [

        {'HTTP': '61.164.39.68:53281'},
        {'HTTP': '27.42.168.46:55481'},
        {'HTTP': '116.9.163.205:58080'},
        {'HTTP': '182.34.102.50:9999'},
        {'HTTP': '183.236.232.160:8080'},
        {'HTTP': '113.124.86.24:9999'},
        {'HTTP': '210.5.10.87:53281'}
    ]

    # 随机获取ip
    ip = ip_list.pop(random.randint(0, len(ip_list) - 1))
    f=open('日本旅游目的地.csv','a+',newline='',encoding='utf-8-sig')
    filename=['地址','累计游玩人数','url']
    writer=csv.DictWriter(f,filename)
    # writer.writeheader()
    for comment in getSpot():
        print(comment)
        writer.writerow(comment)

个人觉得xpath比较简单,用的比较上手

selenium版

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import csv
import pandas as pd
import time


data = pd.read_csv('zhiwu.csv')
names=data['name']
urls=data['link']

def add_options():
    print("—————————— options ——————————")
    # 创建谷歌浏览器驱动参数对象
    chrome_options = webdriver.ChromeOptions()
    # 不加载图片
    # prefs = {"profile.managed_default_content_settings.images": 2}
    # chrome_options.add_experimental_option("prefs", prefs)
    # 使用无界面浏览器模式!!
    chrome_options.add_argument('--headless')
    # 使用隐身模式(无痕模式)
    chrome_options.add_argument('--incognito')
    # 禁用GPU加速
    chrome_options.add_argument('--disable-gpu')
    return chrome_options

# 配置Selenium ChromeDriver
# service = Service('path/to/chromedriver')
# driver = webdriver.Chrome()

driver = webdriver.Chrome(options=add_options())
# 设置等待时间
wait = WebDriverWait(driver, 10)



# 循环爬取每一页的数据
for name,url in zip(names,urls):

    # 访问超链接并提取数据
    driver.get(url)
    # 提取评估信息、形态特征、地理分布等信息
    try:
        eval_info = driver.find_element(By.XPATH, '//*[@id="swx"]').text
    except:
        eval_info = ''
    try:
        morpho_feature = driver.find_element(By.XPATH, '//*[@id="tezheng"]').text
        # print(morpho_feature)
    except:
        morpho_feature = ''
    try:
        geo_distribution = driver.find_element(By.XPATH, '//*[@id="chandi"]').text
        # print(geo_distribution)
    except:
        geo_distribution = ''
    try:
        func_application = driver.find_element(By.XPATH, '//*[@id="gongneng"]').text
        # print(func_application)
    except:
        func_application = ''
    try:
        protection_value = driver.find_element(By.XPATH, '//*[@id="protvalue"]').text
        # print(protection_value)
    except:
        protection_value = ''
    try:
        protection_measure = driver.find_element(By.XPATH, '//*[@id="protway"]').text
        # print(protection_measure)
    except:
        protection_measure = ''
    try:
        cultivation_points = driver.find_element(By.XPATH, '//*[@id="growway"]').text
        # print(cultivation_points)
    except:
        cultivation_points = ''
    try:
        iframe = driver.find_element(By.XPATH, '//*[@id="Label1"]/iframe')
        driver.switch_to.frame(iframe)
        img_url = driver.find_element(By.XPATH, '//*[@id="pinfo"]/a').get_attribute('href')
        print(img_url)
    except:
        img_url = ''
    # 保存为csv文件,文件以表格的中文名列进行命名
    with open(f'{name}.csv', 'w', newline='', encoding='utf-8-sig') as csvfile:
        writer = csv.writer(csvfile)
        writer.writerow(['评估信息', '形态特征', '地理分布', '功能用途', '保护价值', '保护措施', '栽培要点','图片链接'])
        writer.writerow([eval_info, morpho_feature, geo_distribution, func_application,
                         protection_value,protection_measure, cultivation_points,img_url])
    time.sleep(1)


# 关闭浏览器
driver.quit()

新闻版+详情页

import requests
import codecs,csv
import time
import json
from lxml import etree
from pprint import pprint


headers={
 #防盗链
 'referer':'https://news.sina.com.cn/china/',
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.63',
}


def getInfo():
    for i in range(1,31):
        
        try: 
            print('正在爬取'+str(i)+'页')
            #请求url,一般只需要拼接url,即可获取多页
            url = 'https://feed.sina.com.cn/api/roll/get?pageid=121&lid=1356&num=20&versionNumber=1.2.4&page='+str(i)+'&encode=utf-8&callback=feedCardJsonpCallback'
            res=requests.get(url,headers=headers)
            # print(res.text)
            print(res)
            #json格式,直接提取
            
            text=res.text.split('try{feedCardJsonpCallback(')[1].split(');}catch(e){};')[0]
            # print(text)
            data=json.loads(text)
            # pprint(data)
        
            for item in data['result']['data']:
                info={}
                info['标题']=item['title']
                info['简介']=item['intro']
                create_time=int(item['ctime'])
                info['发布时间']=time.strftime("%Y-%m-%d %H:%M",time.localtime(create_time))
                info['主题']=item['keywords']
                try:     
                  info['评论数']=item['comment_total']
                except:
                    info['评论数']=''


                #爬取详情页
                d_url=item['url']

                res_1=requests.get(d_url,headers=headers)
                res_1.encoding='utf-8'   
                html=etree.HTML(res_1.text)
                info['详情']=html.xpath('//*[@id="article"]')[0].xpath('string(.)').replace('\n','').replace('\t','')
                yield info
            time.sleep(2)
        except Exception as e:
            print(e)
            break

if __name__=='__main__':
	#保存数据
    f=codecs.open('新浪新闻.csv','w+',encoding='utf-8-sig')
    filename=['标题','简介','发布时间','主题','评论数','详情']
    writer=csv.DictWriter(f,filename)
    writer.writeheader()
    for info in getInfo():
        print(info)
        writer.writerow(info)




本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

爬虫:你一定要知道的模板(附源码) 的相关文章

随机推荐

  • How to be a under-graduate student

    1 想法去搜集这种记载的文字 所以研究生要学会去搜集资料或信息 2所以我们要看很多的资料 看资料是我们研究生阶段特别重要的 不要轻视了 3 现在培养研究生 就是培养你们要勇于拓宽科技新领域 到第一线去干4论文记载了一个研究课题的过程和结论
  • 电容的频率特性曲线

    电容的频率特性曲线 电容 电容 Capacitance 亦称作 电容量 是指在给定电位差下的电荷储藏量 记为C 国际单位是法拉 F 一般来说 电荷在电场中会受力而移动 当导体之间有了介质 则阻碍了电荷移动而使得电荷累积在导体上 造成电荷的累
  • python-opencv计算重叠矩形面积IOU

    import cv2 import numpy as np def calc riou r1 r2 r1 np array r1 r2 np array r2 rect1 r1 0 r1 1 r1 2 r1 3 r1 4 rect2 r2
  • Redis第二十四讲 Redis集群如何确保数据能被插入到同一个哈希槽与集群的哈希槽为什么是16384

    为什么哈希槽是16384 Redis 集群并没有使用一致性hash 而是引入了哈希槽的概念 Redis 集群有16384个哈希槽 每个key通过CRC16校验后对16384取模来决定放置哪个槽 集群的每个节点负责一部分hash槽 但为什么哈
  • 25_Vue3路由-VueRouter的基本使用及动态路由和路由嵌套

    Vue3路由之Vue router的基本使用及路由嵌套和动态路由 认识前端路由 路由其实是网络工程中的一个术语 在架构一个网络时 非常重要的两个设备就是路由器和交换机 当然 目前在我们生活中路由器也是越来越被大家所熟知 因为我们生活中都会用
  • 代理模式 与装饰模式的区别 干货

    装饰器模式关注于在一个对象上动态的添加方法 然而代理模式关注于控制对对象的访问 换句话 说 用代理模式 代理类 proxy class 可以对它的客户隐藏一个对象的具体信息 因此 当使用代理模式的时候 我们常常在一个代理类中创建一个对象的实
  • 关于机器学习中查准率与查全率(召回率)矛盾关系的探讨

    昨天和舍友讨论查准率和查全率 很多资料中指出之所以需要F1值的原因在于准确率与召回率的关系是矛盾的 即查准率高的查全率低 查全率高的查准率低 因此需要F1值综合度量 但关于为什么两者的关系是矛盾的 一直不太理解 现在看过帖子后总结一些想法
  • ERROR: The install method you used for conda--probably either `pip install conda` or `e

    TOCERROR The install method you used for conda probably either pip install conda or easy install conda is not compatible
  • MySQL安装(全网最全最详细教程)

    目录 1 MySQL的卸载 1 1 停止MySQL服务 1 2 软件的卸载 2 MySQL的下载 安装 配置 2 1 MySQL的4大版本 2 2 软件的下载 2 3 软件的安装 2 4 软件的配置 3 多版本mysql同时安装 4 安装过
  • 西门子PLC全系列模块接线

    https www siemensplc com biancheng 10649 html
  • 最燃黑客情报官薛锋:端起AK伏特加,代表人民把坏人抓

    文 史中 一 情报专家从未凋零真相并不总是像女神一样遥不可及 在二战最为焦灼的时候 盟军迫切地想知道一件事情 德国人究竟有多少坦克 于是他们派出间谍 破译电报 对德国俘虏刑讯逼供 得出的结论是 德国每个月可以生产1000多辆坦克 可是好像哪
  • 用echo输出多个空行

    大家用shell编程 用echo输出空行的时候 通常想到就是用N个echo 如下输出三个空行 echo echo echo 虽然内心里还是觉得如上写法有些丑陋 其实 echo是还有更多用法的 这在手册里面是有说明的 通过查看手册 我们可以知
  • 深度学习系列资料总结

    作者简介 CSDN 阿里云人工智能领域博客专家 新星计划计算机视觉导师 百度飞桨PPDE 专注大数据与AI知识分享 公众号 GoAI的学习小屋 免费分享书籍 简历 导图等 更有交流群分享宝藏资料 关注公众号回复 加群 或 链接 加群 专栏推
  • opencv学习笔记

    include quickdemo h include shuzu h include
  • Flask数据库

    文章目录 一 ORM 1 1 什么是ORM 1 2 ORM的优缺点有哪些 1 3 Flask SQLAlchemy安装及设置 1 4 其他配置信息 1 5 常用的SQLAlchemy字段类型 1 6常用的SQLAlchemy列选项 常用的S
  • java docker nacos 9848端口报错

    问题 9848报错 新版本部署 Nacos2 0版本相比1 X新增了gRPC的通信方式 因此需要增加2个端口 新增端口是在配置的主端口 server port 基础上 进行一定偏移量自动生成 端口 与主端口的偏移量 描述 9848 1000
  • 【PTA】矩阵列平移

    给定一个 n n 的整数矩阵 对任一给定的正整数 k
  • python安装及配置

    1 python的下载及安装 1 1下载 从官网下载 https www python org 如图 点击downloads按钮 在下拉框中选择系统类型 windows Mac OS Linux等 选然后择下载最新版本的Python 1 2
  • JavaArrayList集合基础&学生管理系统

    1 ArrayList 集合和数组的区别 共同点 都是存储数据的容器 不同点 数组的容量是固定的 集合的容量是可变的 1 1 ArrayList的构造方法和添加方法 public ArrayList 创建一个空的集合对象 public bo
  • 爬虫:你一定要知道的模板(附源码)

    爬虫 你一定要知道的模板 附源码 作为一名cv程序员 梦想是造飞机 现实是拧螺丝 普通的爬虫 无非就是固定的模板 xpath bs定位标签 axios返回数据 json解析 selenium json解析版 import requests