爬虫简单实例-爬取拼多多商品信息

10 篇文章 2 订阅
4 篇文章 0 订阅

接口

  • https://youhui.pinduoduo.com/goods/goods-detail?goodsId=商品信息ID

思路

通过遍历商品信息ID来获取商品的信息, 1 ~ 99999999999
然后使用多线程或多进程进行抓取

  • 优点 : 无反爬,实现简单
  • 缺点 : 效率慢,资源损耗大,时间长

效果

在这里插入图片描述
在这里插入图片描述

实现

#!/usr/bin/env python
# -*- coding=utf-8 -*-
__author__ = 'Man Li' 

import os
import re
import sys
import time
import json
import random
import requests
from requests.exceptions import ReadTimeout, ConnectionError, RequestException
import csv

from lxml import etree


from multiprocessing import Process



defaultencoding = 'utf-8'
if sys.getdefaultencoding() != defaultencoding:
    reload(sys)
    sys.setdefaultencoding(defaultencoding)


#USER_AGENTS 随机头信息
USER_AGENTS = [
    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)",
    "Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
    "Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)",
    "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)",
    "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)",
    "Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)",
    "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)",
    "Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6",
    "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1",
    "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0",
    "Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5",
    "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Fedora/1.9.0.8-1.fc10 Kazehakase/0.5.6",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.20 (KHTML, like Gecko) Chrome/19.0.1036.7 Safari/535.20",
    "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/2.0 Safari/536.11",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER",
    "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; LBBROWSER)",
    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E; LBBROWSER)",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 LBBROWSER",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)",
    "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; QQBrowser/7.0.3698.400)",
    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SV1; QQDownload 732; .NET4.0C; .NET4.0E; 360SE)",
    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)",
    "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1",
    "Mozilla/5.0 (iPad; U; CPU OS 4_2_1 like Mac OS X; zh-cn) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5",
    "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0b13pre) Gecko/20110307 Firefox/4.0b13pre",
    "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:16.0) Gecko/20100101 Firefox/16.0",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11",
    "Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10"
]

#构造请求头
HEADER = {
    'User-Agent': random.choice(USER_AGENTS),
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language': 'en-US,en;q=0.5',
    'Connection': 'keep-alive',
    'Accept-Encoding': 'gzip, deflate',
}

#Get网页,返回内容
def get_html( url_path, payload = '', cookies = '',proxies = ''):
	try:
		s = requests.Session()
		r = s.get(
				url_path,#路径
				headers=HEADER,#请求头
				params=payload,#传参 @payload 字典或者json
				cookies=cookies,#cookies
				verify=True,#SSL验证 @verify False忽略;True开启
				proxies=proxies,#代理
				timeout=30)#@timeout 超时单位 秒
		r.raise_for_status()
		#print r.headers#获取响应头
		#print r.cookies#获取cookies
		return r.text
	except ReadTimeout:
 		print('Timeout')
	except ConnectionError:
		print('Connection error')
	except RequestException:
		print('RequestException')

def get_codimg(html):
    datas = etree.HTML(html)
    #print(datas)
    #//*[@id="__next"]/div/div[2]
    info = datas.xpath('//*[@id="__next"]/div/div[2]//text()')
    #print(info)
    return info

def get_image(html):
    html = str(html)
    reg = r"src=\"(.*?)\""
    reger = re.compile(reg, re.S)
    data = re.findall(reger, html)
    return data

csv_data_file = 'D:/PDD_5_7.csv'

# 爬取商品信息ID在 50000000 ~ 100000000 的商品
n=50000000
while n<100000000:
    get_proxies = {
      "http": random.choice(http_ip),
      "https": random.choice(https_ip),
    }
    test1url = "https://youhui.pinduoduo.com/goods/goods-detail?goodsId="+str(n)
    print("链接: "+test1url)
    print("ID : "+str(n))
    #print(get_proxies)
    html_info = get_html(test1url)
    if "An unexpected error has occurred" in str(html_info) or "NaN" in str(html_info):
        #print("未找到商品信息")
        #print("***************************")
        pass
    else:

        cod_link = test1url
        print("商品链接: "+cod_link)
        #print(get_image(html_info))
        imgs = get_image(html_info)
        
        if imgs == []:
            continue

        cod_imglink = imgs[1]
        print("商品图片: "+cod_imglink)
        '''
        for src_img in imgs:
            print(src_img)
        '''
        cod_info = get_codimg(html_info)
        cod_name = cod_info[0]
        print("商品名称: "+cod_name)
        cod_pjiege = cod_info[4]
        print("商品价格: "+cod_pjiege)
        cod_xiaoliang = cod_info[6]
        print("商品销量: "+cod_xiaoliang)
        cod_shop = cod_info[9]
        print("店铺名称: "+cod_shop)
        #cod_shop = cod_info[10]
        print(cod_info[10]+":"+cod_info[11])
        print(cod_info[12]+":"+cod_info[13])
        print(cod_info[14]+":"+cod_info[15])
        '''
        for cod_data in cod_info:
            print(cod_data)
        '''
        time_data = str(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())))
        input_datas = ["拼多多",cod_name.replace("\'",""),cod_link,cod_imglink,cod_pjiege,cod_xiaoliang,cod_shop.replace("\'",""),cod_info[10],
                        cod_info[11],cod_info[12],cod_info[13],cod_info[14],cod_info[15],time_data]
        #print('D:/py_test/yibiao_Auto/report/xyzg_data/tb_test1.csv')

        #input_datas = [cod_name1,cod_name2]
        with open(csv_data_file, 'a', newline='', encoding='utf-8') as f:
            try:
                csv_write = csv.writer(f,dialect='excel')
                csv_write.writerow(input_datas)
            except:
                print("获取内容编码不标准存在问题")
    print("\n")
    n+=1
		
  • 10
    点赞
  • 149
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
### 回答1: # -*- coding:utf-8 -*- import requests import json url = 'http://api.pinduoduo.com/goods/list' payload = { 'keyword': '多多商品', 'page': 1, 'page_size': 20 } headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36' } res = requests.get(url, params=payload, headers=headers) data = json.loads(res.text) if data['data']: for item in data['data']: print(item['name'], item['price']) ### 回答2: 多多是一家知名的电商平台,为了爬取多多商品的信息,我们可以使用Python编写一个爬虫程序。以下是一个简单多多爬虫代码示例: ```python import requests import json def get_goods_info(keyword): url = 'https://api.pinduoduo.com/api/search/advanced' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36' } params = { 'keyword': keyword, 'page': 1, 'size': 10 } response = requests.get(url, headers=headers, params=params) result = response.content.decode('utf-8') data = json.loads(result) goods_list = data['goods_list'] for goods in goods_list: goods_name = goods['goods_name'] sales = goods['sales'] price = goods['price'] print(f'商品名称:{goods_name}') print(f'销量:{sales}') print(f'价格:{price}\n') keyword = input('请输入要搜索的关键字:') get_goods_info(keyword) ``` 这段代码中,我们首先需要通过请求多多的API获取商品的相关信息。在代码中,我们使用了`requests`库发送GET请求,并传入请求参数`keyword`来搜索指定关键字的商品信息。我们将搜索结果以页数和每页显示的数量进行参数配置。 然后,我们将返回的结果进行解析。使用`json`库将返回的结果转换为Python的字典结构,方便我们获取和处理信息。 最后,遍历商品列表,获取每个商品的名称、销量和价格,并将其打印出来。 使用这段代码,我们可以根据输入的关键字获取多多商品的信息。当然,这只是一个简单的示例,实际情况可能会更加复杂,需要根据实际需求进行相应的处理和优化。 ### 回答3: 多多是国内一家知名的社交电商平台,用户通过团购买商品,价格相对较低。下面是一段简单多多爬虫Python代码,用于爬取多多商品的信息。 ``` import requests import json def get_product_info(keyword): url = "https://api.pinduoduo.com/api/oak/product/queryByKeyword" headers = { "Referer": "https://m.pinduoduo.com/search", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36" } params = { "keyword": keyword, "page": 1, "size": 10 } response = requests.get(url, headers=headers, params=params) product_data = json.loads(response.text) if "result" in product_data: for product in product_data["result"]["searchResultVOList"]: product_id = product["goodsId"] product_name = product["goodsName"] product_price = product["groupPrice"] / 100 # 商品价格除以100得到真实价格 print(f"商品ID:{product_id},商品名称:{product_name},商品价格:{product_price}元") else: print("未获取到商品信息") if __name__ == "__main__": keyword = input("请输入要搜索的商品关键字:") get_product_info(keyword) ``` 这段代码使用Pythonrequests库发送HTTP请求,获取商品信息。首先构建请求的URL、请求头和请求参数,然后通过requests.get方法发送GET请求,得到商品数据。接着使用json.loads方法将返回的JSON数据转换成Python对象,再从中提取出商品ID、商品名称和商品价格,并进行简单的数据处理后打印出来。 通过运行此代码,可以根据输入的关键字获取多多商品的信息。注意,这只是一个简单的示例,实际爬取商品数据时需要更多的代码来处理分页、异常情况等。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值