2
import urllib2
import re
import csv
from bs4 import BeautifulSoup

def get_BlahBlah(num1, num2, num3, num4):
    url1 = "http://BlahBlah.com/person_profile/"
    url2 = "?-id="
    url3 = "."
    url4 = "&source=personalranking="
    urlComplete = url1 + str(num1) + url2 + str(num2) + url3 + str(num3) + url4 + str(num4) 
    page = urllib2.urlopen(urlComplete)
    soup_BlahBlah = BeautifulSoup(page, "lxml")
    page.close()

    rank_tag = soup_BlahBlah.find('h1', class_="personal_rank") 

    if rank_tag:
        rank_string = rank_tag.span.string
        return rank_string

for num1_count in range(28343512, 28343512):
    for num2_count in range(9999888888, 9999888889):
        for num3_count in range (7777, 7778):
            for num4_count in range(0, 1):

                record = get_BlahBlah(num1_count, num2_count, num3_count, num4_count)

                saveFile = open('BlahBlah.csv', 'a')
                saveFile.write(str(record)+'\n')
                saveFile.close()

                num4_count += 1
            num3_count += 1
        num2_count += 1
    num1_count += 1

上面的代码可以正常工作,但我想根据我的需要更好、更有效地调整它。我想做的是为每个独特的人抓取和提取“等级”信息(用户类“personal_rank”标签)。我想抓取整个站点中的所有人。

该站点的 URL 结构由各种静态和可变(数字)部分组成,例如:

http://BlahBlah.com/person_profile/XXXXXXXX?-id=XXXXXXXXXX.XXXX&source=personalranking=X *注意这不是我要爬的网站,只是作为例子

其中 X 可以是 0-9 之间的任何数字。这是我的三个不同的问题:

  • 假设 URL 上的所有数字部分对于一个人来说都是唯一的,我可以像我当前的代码一样循环遍历多个循环,是否还有其他方法(更有效)我应该做(而不是四个循环,因为我发现它非常耗时)。

  • 现在,假设只有 num1_count 对单个人是唯一的,并且 num2_count、num3_count 和 num4_count 部分可以是任意组合(只要对应的数字保持不变)并且仍然指的是同一个人(参见下面的示例) ,如何使用正则表达式替换我当前的代码?如果我使用正则表达式来表示部分 URL,我如何将它与循环结合起来?

1) http://BlahBlah.com/person_profile/12345678?-id=1111111111.1111&source=personalranking=1 指彼得潘 2) http://BlahBlah.com/person_profile/12345678?-id=2222222222.1111&source=personalranking=1 也指彼得潘 3) http://BlahBlah.com/person_profile/12345670?-id=2222222222.1111&source=personalranking=1 指罗宾金

  • 跟进第 2 点,假设 num1_count-num3_count 的位数很重要,但最后一个数字部分在某种意义上无关紧要,它可以是一位数或两位数,仍然指的是同一个人,如何我可以编码吗?

提前致谢。

4

0 回答 0