Python爬某网站数据

  • 思路
    1.进入网站,F12或者工具打开控制台工具
    Fetch/XHR过滤查看一下有什么异步请求之类的
    左上角的工具可以查看下布局情况,尤其是html里面的<div>,<img>,<a>等元素


    image.png
  1. 知道逻辑后,打开GPT帮你写就行了,然后你再改改,基本使用的库就两三个
#http组件
import requests
#html网页类的解析工具
from bs4 import BeautifulSoup
import json
#多线程可以用这个
import concurrent.futures

3.修改代码

  • 通过respone = requests.post/.get(url)获得网页
  • 使用soup = BeautifulSoup(response.text, 'html.parser')转化为搜索的html数据
  • 通过soup.find('div' id = 'xxx' class_ = 'xxx')等方式快速定位到你要检索的空间
  • soup返回的也是soup,只需要使用,find,find_all,find,加入不同的条件,就能找到你的内容物
例子 找到所有<div id = "shop_list">下面的<a href="http://xxx.com" alt = "a_name">标签
a_list = soup.find('div',id = 'shop_list').find_all('a' href=True)
for each_a in a_list
  src = each_a['href'] #获取<a>标签的url
  name = each_a['alt']#获取<a>标签的名字

以下是一个完整的商品爬虫

内容大致流程:

image.png
#完整代码,GPT生成了大半了
import requests
from bs4 import BeautifulSoup
import json
import concurrent.futures


#定义数据结构
class Product:
    def __init__(self, id, name, brand, img_url, base_url, brand_url,model):
        self.id = id
        self.name = name
        self.brand = brand
        self.img_url = img_url
        self.base_url = base_url
        self.brand_url = brand_url
        self.model = model

    def to_dict(self):
        """Converts the object into a dictionary."""
        return {
            'id': self.id,
            'name': self.name,
            'brand': self.brand,
            'img_url': self.img_url,
            'base_url': self.base_url,
            'brand_url': self.brand_url,
            'model' : self.model
        }
    
    @classmethod
    def from_dict(cls, data):
        """Create an instance of Product from a dictionary."""
        return cls(
            data['id'],
            data['name'],
            data['brand'],
            data['img_url'],
            data['base_url'],
            data['brand_url'],
            data['model']
        )

    def __str__(self):
        return f"Product(id={self.id}, name='{self.name}', brand='{self.brand}', img_url='{self.img_url}', base_url='{self.base_url}', brand_url='{self.brand_url}, model={self.model}')"


#返回 所有品牌的[url, name]数组
def extract_brand_links(url):
    base_all_shop = []

    try:
        response = requests.get(url)
        if response.status_code == 200:
            soup = BeautifulSoup(response.text, 'html.parser')
            
            # 直接定位到包含品牌的ul标签
            brand_list = soup.find('ul', id='brand_li')
            if brand_list:
                # 查找ul下的所有a标签
                brand_links = brand_list.find_all('a')
                for link in brand_links:
                    href = link.get('href')
                    if href:  # 确保链接存在
                        brand_url = url + href
                        brand_name = link.find('img')['alt']
                        each_brand = [brand_url,brand_name]
                        base_all_shop.append(each_brand)
                
                # 提取并保存链接
                with open("brand_links.txt", "w") as file:
                    for link_brand in base_all_shop:
                        file.write(link_brand[0] +"  "+ link_brand[1] + "\n")  # 写入链接并添加换行符
    except Exception as e:
        print(f"An error occurred: {e}")
    return base_all_shop


#清晰的根据每个品牌的分页进行整合数据base_brand[0]就是品牌的url地址
def fetch_brand_links_from_pages(base_brand,base_url):
    all_product = []
    
    # 访问首页获取总页数
    home_response = requests.get(base_brand[0])
    home_soup = BeautifulSoup(home_response.text, 'html.parser')
    pagination = home_soup.find('ul', class_='pages')
    if pagination:
        page_links = pagination.find_all('a', href=True)
        pages= pagination.find_all('li')
        max_pages = (len(pages) - 2)#这个网站的分页可以根据(il列表数量-2)获得最高页数

        for page_each in range(max_pages):
            # 构造当前页的URL
            page_url = f"{base_brand[0]}?page={(page_each+1)}"
            page_response = requests.get(page_url)
            if page_response.status_code == 200:
                page_soup = BeautifulSoup(page_response.text, 'html.parser')
                product_list = page_soup.find('ul', id='lay_goods')
                
                if product_list:
                    product_links = product_list.find_all('a', href=True)
                    for link in product_links:
                        product_id = link['href'] .split('id-')[-1].split('.html')[0]#得到商品的id
                        product_link = base_url + link['href']  # 拼接完整商品链接
                        product_name = link.find('div').find('img')['alt'] # 获取到商品的名字
                        product_img_url = link.find('div').find('img')['lay-src'] # 获取到图片的链接
                        product = Product(product_id, product_name,base_brand[1], product_img_url, product_link, base_brand[0],False)
                        print(product)
                        all_product.append(product)
    return all_product

def main():
        # 基础URL(去掉了末尾的"/")
    base_url = "https://www.pytestweb.com"


    # 获取所有商品链接
    brand_links = extract_brand_links(base_url)

    total_products = []
    for product_link in brand_links:
        each_products = fetch_brand_links_from_pages(product_link,base_url)
        total_products.extend(each_products)

    products_dicts = [product.to_dict() for product in total_products]

    with open("products.json", "w") as file:
        json.dump(products_dicts, file, ensure_ascii=False, indent=4)
    
    print("Product links have been saved to products.json")
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,001评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,210评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,874评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,001评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,022评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,005评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,929评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,742评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,193评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,427评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,583评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,305评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,911评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,564评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,731评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,581评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,478评论 2 352